diff --git a/vcg/complex/algorithms/clean.h b/vcg/complex/algorithms/clean.h index c514599e..e69dabe8 100644 --- a/vcg/complex/algorithms/clean.h +++ b/vcg/complex/algorithms/clean.h @@ -117,7 +117,8 @@ private: typedef typename MeshType::VertexPointer VertexPointer; typedef typename MeshType::VertexIterator VertexIterator; typedef typename MeshType::ConstVertexIterator ConstVertexIterator; - typedef typename MeshType::EdgeIterator EdgeIterator; + typedef typename MeshType::EdgeIterator EdgeIterator; + typedef typename MeshType::EdgePointer EdgePointer; typedef typename MeshType::ScalarType ScalarType; typedef typename MeshType::FaceType FaceType; typedef typename MeshType::FacePointer FacePointer; @@ -207,10 +208,37 @@ private: (*ei).V(k) = &*mp[ (*ei).V(k) ]; } if(RemoveDegenerateFlag) RemoveDegenerateFace(m); - if(RemoveDegenerateFlag) RemoveDegenerateEdge(m); + if(RemoveDegenerateFlag && m.en>0) { + RemoveDegenerateEdge(m); + RemoveDuplicateEdge(m); + } return deleted; } + class SortedPair + { + public: + SortedPair() {} + SortedPair(unsigned int v0, unsigned int v1, EdgePointer _fp) + { + v[0]=v0;v[1]=v1; + fp=_fp; + if(v[0]>v[1]) std::swap(v[0],v[1]); + } + bool operator < (const SortedPair &p) const + { + return (v[1]!=p.v[1])?(v[1]0); // just to be sure we are using an edge mesh... + std::vector eVec; + for(EdgeIterator ei=m.edge.begin();ei!=m.edge.end();++ei) + if(!(*ei).IsD()) + { + eVec.push_back(SortedPair( tri::Index(m,(*ei).V(0)), tri::Index(m,(*ei).V(1)), &*ei)); + } + assert (size_t(m.en) == eVec.size()); + //for(int i=0;i::DeleteEdge(m, *(eVec[i].fp) ); + //qDebug("deleting face %i (pos in fvec %i)",tri::Index(m,fvec[i].fp) ,i); + } + } + return total; + } /** This function removes that are not referenced by any face. The function updates the vn counter. @param m The mesh @return The number of removed vertices @@ -717,7 +775,41 @@ private: return true; } + /** + * Count the number of non manifold edges in a polylinemesh, e.g. the edges where there are more than 2 incident faces. + * + */ + static int CountNonManifoldEdgeEE( MeshType & m, bool SelectFlag=false) + { + assert(m.fn == 0 && m.en >0); // just to be sure we are using an edge mesh... + assert(tri::HasEEAdjacency(m)); + tri::UpdateTopology::EdgeEdge(m); + if(SelectFlag) UpdateSelection::ClearVertex(m); + + int nonManifoldCnt=0; + SimpleTempData TD(m.vert,0); + + // First Loop, just count how many faces are incident on a vertex and store it in the TemporaryData Counter. + EdgeIterator ei; + for (ei = m.edge.begin(); ei != m.edge.end(); ++ei) if (!ei->IsD()) + { + TD[(*ei).V(0)]++; + TD[(*ei).V(1)]++; + } + + tri::UpdateFlags::VertexClearV(m); + // Second Loop, Check that each vertex have been seen 1 or 2 times. + for (VertexIterator vi = m.vert.begin(); vi != m.vert.end(); ++vi) if (!vi->IsD()) + { + if( TD[vi] >2 ) + { + if(SelectFlag) (*vi).SetS(); + nonManifoldCnt++; + } + } + return nonManifoldCnt; + } /** * Count the number of non manifold edges in a mesh, e.g. the edges where there are more than 2 incident faces.