void GW_Mesh::ExtractBoundary( GW_Vertex& seed, T_VertexList& boundary, T_VertexMap* pExtracted ) { GW_ASSERT( seed.IsBoundaryVertex() ); GW_Vertex* pPrev = NULL; GW_Vertex* pCur = &seed; GW_Vertex* pNext = NULL; GW_U32 num = 0; do { num++; boundary.push_back(pCur); if( pExtracted!=NULL ) (*pExtracted)[ pCur->GetID() ] = pCur; pNext = NULL; for( GW_VertexIterator it = pCur->BeginVertexIterator(); (it!=pCur->EndVertexIterator()) && (pNext==NULL); ++it ) { GW_Vertex* pVert = *it; if( pVert->IsBoundaryVertex() && pVert!=pPrev ) pNext = pVert; } GW_ASSERT( pNext!=NULL ); pPrev = pCur; pCur = pNext; } while( pCur!=&seed && pNext!=NULL && num<this->GetNbrVertex() ); }
/*------------------------------------------------------------------------------*/ void GW_Mesh::IterateConnectedComponent_Vertex( GW_Vertex& start_vert, VertexIterate_Callback pCallback ) { /* march on the voronoi diagram */ T_VertexList VertexToProceed; VertexToProceed.push_back( &start_vert ); T_VertexMap VertexDone; VertexDone[ start_vert.GetID() ] = &start_vert; while( !VertexToProceed.empty() ) { GW_Vertex* pVert = VertexToProceed.front(); GW_ASSERT( pVert!=NULL ); VertexToProceed.pop_front(); /* cut the face */ pCallback( *pVert ); /* add neighbors */ for( GW_VertexIterator it = pVert->BeginVertexIterator(); it!=pVert->EndVertexIterator(); ++it ) { GW_Vertex* pNewVert = (GW_Vertex*) *it; if( pNewVert==NULL ) break; GW_ASSERT( pNewVert!=NULL ); if( VertexDone.find(pNewVert->GetID())==VertexDone.end() ) { VertexToProceed.push_back( pNewVert ); VertexDone[ pNewVert->GetID() ] = pNewVert; // so that it won't be added anymore } } } }