Added ConnectedIterator (should be moved somewhere else)
Cleaned ConnectedComponents
This commit is contained in:
parent
5e451b6435
commit
2bf25202a4
|
@ -24,6 +24,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.35 2006/02/28 16:51:29 ponchio
|
||||||
|
Added typename
|
||||||
|
|
||||||
Revision 1.34 2006/02/01 15:27:00 cignoni
|
Revision 1.34 2006/02/01 15:27:00 cignoni
|
||||||
Added IsD() test in SelfIntersection
|
Added IsD() test in SelfIntersection
|
||||||
|
|
||||||
|
@ -156,6 +159,62 @@ Initial Release
|
||||||
|
|
||||||
namespace vcg {
|
namespace vcg {
|
||||||
namespace tri{
|
namespace tri{
|
||||||
|
template <class ConnectedMeshType>
|
||||||
|
class ConnectedIterator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef ConnectedMeshType MeshType;
|
||||||
|
typedef typename MeshType::VertexType VertexType;
|
||||||
|
typedef typename MeshType::VertexPointer VertexPointer;
|
||||||
|
typedef typename MeshType::VertexIterator VertexIterator;
|
||||||
|
typedef typename MeshType::ScalarType ScalarType;
|
||||||
|
typedef typename MeshType::FaceType FaceType;
|
||||||
|
typedef typename MeshType::FacePointer FacePointer;
|
||||||
|
typedef typename MeshType::FaceIterator FaceIterator;
|
||||||
|
typedef typename MeshType::FaceContainer FaceContainer;
|
||||||
|
typedef typename vcg::Box3<ScalarType> Box3Type;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void operator ++()
|
||||||
|
{
|
||||||
|
FacePointer fpt=sf.top();
|
||||||
|
sf.pop();
|
||||||
|
for(int j=0;j<3;++j)
|
||||||
|
if( !face::IsBorder(*fpt,j) )
|
||||||
|
{
|
||||||
|
FacePointer l=fpt->FFp(j);
|
||||||
|
if( !mp->IsMarked(l) )
|
||||||
|
{
|
||||||
|
mp->Mark(l);
|
||||||
|
sf.push(l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void start(MeshType &m, FacePointer p)
|
||||||
|
{
|
||||||
|
mp=&m;
|
||||||
|
while(!sf.empty()) sf.pop();
|
||||||
|
mp->UnMarkAll();
|
||||||
|
assert(p);
|
||||||
|
assert(!p->IsD());
|
||||||
|
mp->Mark(p);
|
||||||
|
sf.push(p);
|
||||||
|
}
|
||||||
|
bool completed() {
|
||||||
|
return sf.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
FacePointer operator *()
|
||||||
|
{
|
||||||
|
return sf.top();
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
std::stack<FacePointer> sf;
|
||||||
|
MeshType *mp;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/** \addtogroup trimesh */
|
/** \addtogroup trimesh */
|
||||||
/*@{*/
|
/*@{*/
|
||||||
|
@ -558,43 +617,51 @@ namespace vcg {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int DeleteConnectedComponent(MeshType &m,FacePointer fp)
|
||||||
|
{
|
||||||
|
int deleted=0;
|
||||||
|
return deleted;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Compute the set of connected components of a given mesh
|
||||||
|
it fills a vector of pair < int , faceptr > with, for each connecteed component its size and a represnant
|
||||||
|
*/
|
||||||
static int ConnectedComponents(MeshType &m)
|
static int ConnectedComponents(MeshType &m)
|
||||||
|
{
|
||||||
|
std::vector< std::pair<int,FacePointer> > &CCV
|
||||||
|
return ConnectedComponents(m,CCV);
|
||||||
|
}
|
||||||
|
static int ConnectedComponents(MeshType &m, std::vector< std::pair<int,FacePointer> > &CCV)
|
||||||
{
|
{
|
||||||
FaceIterator fi;
|
FaceIterator fi;
|
||||||
//FaceIterator gi;
|
FacePointer l;
|
||||||
vcg::face::Pos<FaceType> he;
|
CCV.clear();
|
||||||
vcg::face::Pos<FaceType> hei;
|
|
||||||
|
|
||||||
std::vector<int> nrfaces;
|
|
||||||
nrfaces.reserve(1);
|
|
||||||
|
|
||||||
for(fi=m.face.begin();fi!=m.face.end();++fi)
|
for(fi=m.face.begin();fi!=m.face.end();++fi)
|
||||||
(*fi).ClearS();
|
(*fi).ClearS();
|
||||||
//gi=m.face.begin(); fi=gi;
|
|
||||||
int Compindex=0;
|
int Compindex=0;
|
||||||
std::stack<FacePointer> sf;
|
std::stack<FacePointer> sf;
|
||||||
FacePointer gi=&*(m.face.begin());
|
FacePointer fpt=&*(m.face.begin());
|
||||||
FaceType *l;
|
|
||||||
for(fi=m.face.begin();fi!=m.face.end();++fi)
|
for(fi=m.face.begin();fi!=m.face.end();++fi)
|
||||||
{
|
{
|
||||||
if(!((*fi).IsD()))
|
if(!((*fi).IsD()) && !(*fi).IsS())
|
||||||
{
|
|
||||||
if (!(*fi).IsS())
|
|
||||||
{
|
{
|
||||||
(*fi).SetS();
|
(*fi).SetS();
|
||||||
//(*fi).Q()=Compindex;
|
CCV.push_back(make_pair(0,&*fi));
|
||||||
nrfaces.push_back(1);
|
|
||||||
sf.push(&*fi);
|
sf.push(&*fi);
|
||||||
while (!sf.empty())
|
while (!sf.empty())
|
||||||
{
|
{
|
||||||
gi=sf.top();
|
fpt=sf.top();
|
||||||
he.Set(&(*gi),0,gi->V(0));
|
++CCV.back().first;
|
||||||
sf.pop();
|
sf.pop();
|
||||||
for(int j=0;j<3;++j)
|
for(int j=0;j<3;++j)
|
||||||
{
|
{
|
||||||
if( !face::IsBorder(*gi,j) )
|
if( !face::IsBorder(*fpt,j) )
|
||||||
{
|
{
|
||||||
l=he.f->FFp(j);
|
l=fpt->FFp(j);
|
||||||
if( !(*l).IsS() )
|
if( !(*l).IsS() )
|
||||||
{
|
{
|
||||||
(*l).SetS();
|
(*l).SetS();
|
||||||
|
@ -605,8 +672,8 @@ namespace vcg {
|
||||||
}
|
}
|
||||||
Compindex++;
|
Compindex++;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
assert(CCV.size()==Compindex);
|
||||||
return Compindex;
|
return Compindex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue