From 2b9a9f2be2a35f1a6abed926b4e57d80d4437042 Mon Sep 17 00:00:00 2001 From: cignoni <paolo.cignoni@isti.cnr.it> Date: Mon, 28 Jan 2013 15:42:24 +0000 Subject: [PATCH] removed a useless loop in the update cycle of the heap of the edges to be collapesed. Stupid bug pointed out by Enrico (thanks!) --- .../local_optimization/tri_edge_collapse.h | 81 ++++++++--------- .../tri_edge_collapse_quadric.h | 90 +++++++++---------- 2 files changed, 82 insertions(+), 89 deletions(-) diff --git a/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h b/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h index 01a22ba6..36364ac9 100644 --- a/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h +++ b/vcg/complex/algorithms/local_optimization/tri_edge_collapse.h @@ -134,61 +134,56 @@ public: inline void UpdateHeap(HeapType & h_ret, BaseParameterClass *pp) { - GlobalMark()++; int nn=0; - VertexType *v[2]; - v[0]= pos.V(0);v[1]=pos.V(1); - v[1]->IMark() = GlobalMark(); + GlobalMark()++; + VertexType *v[2]; + v[0]= pos.V(0);v[1]=pos.V(1); + v[1]->IMark() = GlobalMark(); - // First loop around the remaining vertex to unmark visited flags + // First loop around the remaining vertex to unmark visited flags vcg::face::VFIterator<FaceType> vfi(v[1]); - while (!vfi.End()){ - vfi.V1()->ClearV(); - vfi.V2()->ClearV(); - ++vfi; - } + while (!vfi.End()){ + vfi.V1()->ClearV(); + vfi.V2()->ClearV(); + ++vfi; + } // Second Loop: add all the outgoing edges around v[1] // for each face add the two edges outgoing from v[1] and not visited. vfi = face::VFIterator<FaceType>(v[1]); while (!vfi.End()) { - assert(!vfi.F()->IsD()); - for (int j=0;j<3;j++) - { - if( !(vfi.V1()->IsV()) && (vfi.V1()->IsRW())) - { - vfi.V1()->SetV(); - h_ret.push_back(HeapElem(new MYTYPE(VertexPair( vfi.V(),vfi.V1() ),GlobalMark(),pp))); + assert(!vfi.F()->IsD()); + if( !(vfi.V1()->IsV()) && (vfi.V1()->IsRW())) + { + vfi.V1()->SetV(); + h_ret.push_back(HeapElem(new MYTYPE(VertexPair( vfi.V(),vfi.V1() ),GlobalMark(),pp))); + std::push_heap(h_ret.begin(),h_ret.end()); + if(! this->IsSymmetric(pp)){ + h_ret.push_back(HeapElem(new MYTYPE(VertexPair( vfi.V1(),vfi.V()),GlobalMark(),pp))); std::push_heap(h_ret.begin(),h_ret.end()); - if(! this->IsSymmetric(pp)){ - h_ret.push_back(HeapElem(new MYTYPE(VertexPair( vfi.V1(),vfi.V()),GlobalMark(),pp))); - std::push_heap(h_ret.begin(),h_ret.end()); - } } - if( !(vfi.V2()->IsV()) && (vfi.V2()->IsRW())) - { - vfi.V2()->SetV(); - h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.F()->V(vfi.I()),vfi.F()->V2(vfi.I())),GlobalMark(),pp))); + } + if( !(vfi.V2()->IsV()) && (vfi.V2()->IsRW())) + { + vfi.V2()->SetV(); + h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.F()->V(vfi.I()),vfi.F()->V2(vfi.I())),GlobalMark(),pp))); + std::push_heap(h_ret.begin(),h_ret.end()); + if(! this->IsSymmetric(pp)){ + h_ret.push_back(HeapElem(new MYTYPE(VertexPair (vfi.F()->V1(vfi.I()),vfi.F()->V(vfi.I())),GlobalMark(),pp))); std::push_heap(h_ret.begin(),h_ret.end()); - if(! this->IsSymmetric(pp)){ - h_ret.push_back(HeapElem(new MYTYPE(VertexPair (vfi.F()->V1(vfi.I()),vfi.F()->V(vfi.I())),GlobalMark(),pp))); - std::push_heap(h_ret.begin(),h_ret.end()); - } } - // if(vfi.V1()->IsRW() && vfi.V2()->IsRW() ) -// { -// h_ret.push_back(HeapElem(new MYTYPE(EdgeType(vfi.V1(),vfi.V2()),this->GlobalMark()))); -// std::push_heap(h_ret.begin(),h_ret.end()); -// if(IsSymmetric()){ -// h_ret.push_back(HeapElem(new MYTYPE(EdgeType(vfi.V2(),vfi.V1()), this->GlobalMark()))); -// std::push_heap(h_ret.begin(),h_ret.end()); -// } -// } - - } - ++vfi;nn++; - } -// printf("ADDED %d\n",nn); + } + // if(vfi.V1()->IsRW() && vfi.V2()->IsRW() ) + // { + // h_ret.push_back(HeapElem(new MYTYPE(EdgeType(vfi.V1(),vfi.V2()),this->GlobalMark()))); + // std::push_heap(h_ret.begin(),h_ret.end()); + // if(IsSymmetric()){ + // h_ret.push_back(HeapElem(new MYTYPE(EdgeType(vfi.V2(),vfi.V1()), this->GlobalMark()))); + // std::push_heap(h_ret.begin(),h_ret.end()); + // } + // } + ++vfi; + } // end while } ModifierType IsOfType(){ return TriEdgeCollapseOp;} diff --git a/vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric.h b/vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric.h index f6e9f640..b53de839 100644 --- a/vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric.h +++ b/vcg/complex/algorithms/local_optimization/tri_edge_collapse_quadric.h @@ -453,63 +453,61 @@ public: inline void UpdateHeap(HeapType & h_ret,BaseParameterClass *_pp) { QParameter *pp=(QParameter *)_pp; - this->GlobalMark()++; - VertexType *v[2]; - v[0]= this->pos.V(0); - v[1]= this->pos.V(1); - v[1]->IMark() = this->GlobalMark(); + this->GlobalMark()++; + VertexType *v[2]; + v[0]= this->pos.V(0); + v[1]= this->pos.V(1); + v[1]->IMark() = this->GlobalMark(); - // First loop around the remaining vertex to unmark visited flags - vcg::face::VFIterator<FaceType> vfi(v[1]); - while (!vfi.End()){ - vfi.V1()->ClearV(); - vfi.V2()->ClearV(); - ++vfi; - } + // First loop around the remaining vertex to unmark visited flags + vcg::face::VFIterator<FaceType> vfi(v[1]); + while (!vfi.End()){ + vfi.V1()->ClearV(); + vfi.V2()->ClearV(); + ++vfi; + } - // Second Loop - vfi = face::VFIterator<FaceType>(v[1]); - while (!vfi.End()) + // Second Loop + vfi = face::VFIterator<FaceType>(v[1]); + while (!vfi.End()) { - assert(!vfi.F()->IsD()); - for (int j=0;j<3;j++) - { - if( !(vfi.V1()->IsV()) && vfi.V1()->IsRW()) - { - vfi.V1()->SetV(); - h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V0(),vfi.V1()), this->GlobalMark(),_pp))); - std::push_heap(h_ret.begin(),h_ret.end()); - if(!IsSymmetric(pp)){ - h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V1(),vfi.V0()), this->GlobalMark(),_pp))); - std::push_heap(h_ret.begin(),h_ret.end()); - } + assert(!vfi.F()->IsD()); + if( !(vfi.V1()->IsV()) && vfi.V1()->IsRW()) + { + vfi.V1()->SetV(); + h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V0(),vfi.V1()), this->GlobalMark(),_pp))); + std::push_heap(h_ret.begin(),h_ret.end()); + if(!IsSymmetric(pp)){ + h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V1(),vfi.V0()), this->GlobalMark(),_pp))); + std::push_heap(h_ret.begin(),h_ret.end()); } - if( !(vfi.V2()->IsV()) && vfi.V2()->IsRW()) - { - vfi.V2()->SetV(); - h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V0(),vfi.V2()),this->GlobalMark(),_pp))); - std::push_heap(h_ret.begin(),h_ret.end()); - if(!IsSymmetric(pp)){ - h_ret.push_back( HeapElem(new MYTYPE(VertexPair(vfi.V2(),vfi.V0()), this->GlobalMark(),_pp) ) ); - std::push_heap(h_ret.begin(),h_ret.end()); - } + } + if( !(vfi.V2()->IsV()) && vfi.V2()->IsRW()) + { + vfi.V2()->SetV(); + h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V0(),vfi.V2()),this->GlobalMark(),_pp))); + std::push_heap(h_ret.begin(),h_ret.end()); + if(!IsSymmetric(pp)){ + h_ret.push_back( HeapElem(new MYTYPE(VertexPair(vfi.V2(),vfi.V0()), this->GlobalMark(),_pp) ) ); + std::push_heap(h_ret.begin(),h_ret.end()); } - if(pp->SafeHeapUpdate && vfi.V1()->IsRW() && vfi.V2()->IsRW() ) - { - h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V1(),vfi.V2()),this->GlobalMark(),_pp))); - std::push_heap(h_ret.begin(),h_ret.end()); - if(!IsSymmetric(pp)){ - h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V2(),vfi.V1()), this->GlobalMark(),_pp))); - std::push_heap(h_ret.begin(),h_ret.end()); - } + } + if(pp->SafeHeapUpdate && vfi.V1()->IsRW() && vfi.V2()->IsRW() ) + { + h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V1(),vfi.V2()),this->GlobalMark(),_pp))); + std::push_heap(h_ret.begin(),h_ret.end()); + if(!IsSymmetric(pp)){ + h_ret.push_back(HeapElem(new MYTYPE(VertexPair(vfi.V2(),vfi.V1()), this->GlobalMark(),_pp))); + std::push_heap(h_ret.begin(),h_ret.end()); } - } + } + ++vfi; } } -static void InitQuadric(TriMeshType &m,BaseParameterClass *_pp) + static void InitQuadric(TriMeshType &m,BaseParameterClass *_pp) { QParameter *pp=(QParameter *)_pp; typename TriMeshType::FaceIterator pf;