source: GTP/trunk/Lib/Geom/shared/GTGeometry/src/libs/gfx/tools/heap.cxx @ 1600

Revision 1600, 1.9 KB checked in by gumbau, 18 years ago (diff)

Fixed simplification bug when simplifying to extremely a low factor

RevLine 
[774]1//#include <iostream.h>
2#include <gfx/std.h>
3#include <gfx/tools/Heap.h>
4
[1025]5using namespace simplif;
[774]6
7void Heap::swap(int i,int j)
8{
[1526]9        heap_node tmp = ref(i);
[774]10
[1526]11        ref(i) = ref(j);
12        ref(j) = tmp;
[774]13
[1526]14        ref(i).obj->setHeapPos(i);
15        ref(j).obj->setHeapPos(j);
[774]16}
17
18void Heap::upheap(int i)
19{
[1526]20        if( i==0 ) return;
[774]21
[1526]22        if( ref(i).import > ref(parent(i)).import )
23        {
24                swap(i,parent(i));
25                upheap(parent(i));
26        }
[774]27}
28
29void Heap::downheap(int i)
30{
[1526]31        if (i>=size) return;        // perhaps just extracted the last
[774]32
[1526]33        int largest = i,
34                        l = left(i),
35                        r = right(i);
[774]36
[1526]37        if( l<size && ref(l).import > ref(largest).import ) largest = l;
38        if( r<size && ref(r).import > ref(largest).import ) largest = r;
[774]39
[1526]40        if( largest != i ) {
41                swap(i,largest);
42                downheap(largest);
43        }
[774]44}
45
46void Heap::insert(Heapable *t,float v)
47{
[1526]48        if( size == maxLength() )
49        {
50                std::cerr << "NOTE: Growing heap from " << size << " to " << 2*size << std::endl;
51                resize(2*size);
52        }
[774]53
[1526]54        int i = size++;
[774]55
[1526]56        ref(i).obj = t;
57        ref(i).import = v;
[774]58
[1526]59        ref(i).obj->setHeapPos(i);
[774]60
[1526]61        upheap(i);
[774]62}
63
64void Heap::update(Heapable *t,float v)
65{
[1526]66        int i = t->getHeapPos();
[774]67
[1526]68        if( i >= size )
69        {
[774]70                std::cerr << "WARNING: Attempting to update past end of heap!" << std::endl;
71                return;
[1526]72        }
73        else if( i == NOT_IN_HEAP )
74        {
[774]75                std::cerr << "WARNING: Attempting to update object not in heap!" << std::endl;
76                return;
[1526]77        }
[774]78
[1526]79        float old=ref(i).import;
80        ref(i).import = v;
[774]81
[1526]82        if( v<old )
83                downheap(i);
84        else
85                upheap(i);
[774]86}
87
[1526]88heap_node *Heap::extract()
89{
90        if( size<1 ) return 0;
[774]91
[1526]92        swap(0,size-1);
93        size--;
[774]94
[1526]95        downheap(0);
96
97        ref(size).obj->notInHeap();
98
99        return &ref(size);
100}
101
[774]102heap_node *Heap::kill(int i)
103{
[1526]104        if( i>=size )
[774]105                std::cerr << "WARNING: Attempt to delete invalid heap node." << std::endl;
106
[1526]107        swap(i, size-1);
108        size--;
109        ref(size).obj->notInHeap();
[774]110
[1526]111        if( ref(i).import < ref(size).import )
[774]112                downheap(i);
[1526]113        else
[774]114                upheap(i);
115
[1526]116        return &ref(size);
117}
[774]118
Note: See TracBrowser for help on using the repository browser.