Small optimisation in the edge collapse.
One of the two sets of faces computed during the collapse was useless.
This commit is contained in:
parent
da8b1825c6
commit
8ac9680253
|
@ -20,8 +20,8 @@
|
||||||
* for more details. *
|
* for more details. *
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#ifndef __VCG_TETRA_TRI_COLLAPSE
|
#ifndef _VCG_EDGE_COLLAPSE_
|
||||||
#define __VCG_TETRA_TRI_COLLAPSE
|
#define _VCG_EDGE_COLLAPSE_
|
||||||
|
|
||||||
|
|
||||||
#include<vcg/simplex/face/pos.h>
|
#include<vcg/simplex/face/pos.h>
|
||||||
|
@ -68,7 +68,7 @@ private:
|
||||||
{
|
{
|
||||||
VFIVec av0, av1, av01;
|
VFIVec av0, av1, av01;
|
||||||
VFIVec & AV0() { return av0;} // Faces incident only on v0
|
VFIVec & AV0() { return av0;} // Faces incident only on v0
|
||||||
VFIVec & AV1() { return av1;} // Faces incident only on v1
|
// VFIVec & AV1() { return av1;} // Faces incident only on v1
|
||||||
VFIVec & AV01(){ return av01;} // Faces incident only on both v0 and v1
|
VFIVec & AV01(){ return av01;} // Faces incident only on both v0 and v1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ private:
|
||||||
VertexType * v1 = p.V(1);
|
VertexType * v1 = p.V(1);
|
||||||
|
|
||||||
es.AV0().clear();
|
es.AV0().clear();
|
||||||
es.AV1().clear();
|
// es.AV1().clear();
|
||||||
es.AV01().clear();
|
es.AV01().clear();
|
||||||
|
|
||||||
for(VFIterator x = VFIterator(v0); !x.End(); ++x)
|
for(VFIterator x = VFIterator(v0); !x.End(); ++x)
|
||||||
|
@ -93,16 +93,16 @@ private:
|
||||||
else es.AV01().push_back( x );
|
else es.AV01().push_back( x );
|
||||||
}
|
}
|
||||||
|
|
||||||
for( VFIterator x = VFIterator(v1); !x.End(); ++x)
|
// for( VFIterator x = VFIterator(v1); !x.End(); ++x)
|
||||||
{
|
// {
|
||||||
bool foundV0=false;
|
// bool foundV0=false;
|
||||||
for(int j=0;j<3;++j)
|
// for(int j=0;j<3;++j)
|
||||||
if( x.f->V(j)==v0 ) {
|
// if( x.f->V(j)==v0 ) {
|
||||||
foundV0=true;
|
// foundV0=true;
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
if(!foundV0) es.AV1().push_back( x ); // v0 not found -> so the face is incident only on v0
|
// if(!foundV0) es.AV1().push_back( x ); // v0 not found -> so the face is incident only on v0
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -206,17 +206,16 @@ public:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main Collapsing Function: the one that actually makes the collapse
|
// Main Collapsing Function: the one that actually performs the collapse of the edge denoted by the VertexPair c
|
||||||
// Remember that v[0] will be deleted and v[1] will survive (eventually with a new position)
|
// Remember that v[0] will be deleted and v[1] will survive with the position indicated by p
|
||||||
// hint: to do a collapse onto a vertex simply pass p as the position of the surviving vertex
|
// To do a collapse onto a vertex simply pass p as the position of the surviving vertex
|
||||||
static int Do(TriMeshType &m, VertexPair & c, const Point3<ScalarType> &p)
|
static int Do(TriMeshType &m, VertexPair & c, const Point3<ScalarType> &p)
|
||||||
{
|
{
|
||||||
EdgeSet es;
|
EdgeSet es;
|
||||||
FindSets(c,es);
|
FindSets(c,es);
|
||||||
typename VFIVec::iterator i;
|
|
||||||
int n_face_del =0 ;
|
|
||||||
|
|
||||||
for(i=es.AV01().begin();i!=es.AV01().end();++i)
|
int n_face_del=0 ;
|
||||||
|
for(auto i=es.AV01().begin();i!=es.AV01().end();++i)
|
||||||
{
|
{
|
||||||
FaceType & f = *((*i).f);
|
FaceType & f = *((*i).f);
|
||||||
assert(f.V((*i).z) == c.V(0));
|
assert(f.V((*i).z) == c.V(0));
|
||||||
|
@ -226,14 +225,17 @@ public:
|
||||||
n_face_del++;
|
n_face_del++;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Update Vertex-Face topology
|
// Very LOW LEVEL update of VF Adjacency;
|
||||||
for(i=es.AV0().begin();i!=es.AV0().end();++i)
|
// for all the faces incident in v[0]
|
||||||
|
// - v[0] will be deleted so we substitute v[0] with v[1]
|
||||||
|
// - we prepend that face to the list of the faces incident on v[1]
|
||||||
|
for(auto i=es.AV0().begin();i!=es.AV0().end();++i)
|
||||||
{
|
{
|
||||||
(*i).f->V((*i).z) = c.V(1); // For each face in v0 we substitute v0 with v1
|
(*i).f->V((*i).z) = c.V(1); // For each face in v0 we substitute v0 with v1
|
||||||
(*i).f->VFp((*i).z) = (*i).f->V((*i).z)->VFp(); // e appendo la lista di facce incidenti in v1 a questa faccia
|
(*i).f->VFp((*i).z) = c.V(1)->VFp();
|
||||||
(*i).f->VFi((*i).z) = (*i).f->V((*i).z)->VFi();
|
(*i).f->VFi((*i).z) = c.V(1)->VFi();
|
||||||
(*i).f->V((*i).z)->VFp() = (*i).f;
|
c.V(1)->VFp() = (*i).f;
|
||||||
(*i).f->V((*i).z)->VFi() = (*i).z;
|
c.V(1)->VFi() = (*i).z;
|
||||||
}
|
}
|
||||||
|
|
||||||
Allocator<TriMeshType>::DeleteVertex(m,*(c.V(0)));
|
Allocator<TriMeshType>::DeleteVertex(m,*(c.V(0)));
|
||||||
|
@ -243,6 +245,6 @@ public:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // end namespace tri
|
||||||
}
|
} // end namespace vcg
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue