Exemplo n.º 1
0
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() );
}
Exemplo n.º 2
0
/*------------------------------------------------------------------------------*/
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
			}
		}
	}
}