void markVertexTypes() { TIntSet::const_iterator vit, vitEnd = vertices.end(); // first pass: mark all interior and single-border vertices for( vit = vertices.begin(); vit != vitEnd; ++vit ) { int idx = *vit; if( vertexUseCount[idx] == 1 ) { vertexTypes[idx] = VTYPE_SINGLE; borderVertices.insert( idx ); } else if( isVertexInterior(idx) ) vertexTypes[idx] = VTYPE_INTERIOR; } // now, the unmarked vertices are all shared and on border for( vit = vertices.begin(); vit != vitEnd; ++vit ) { int idx = *vit; if( vertexTypes[idx] == VTYPE_NONE ) { vertexTypes[idx] = VTYPE_MULTI; borderVertices.insert( idx ); } } }
void addPolygon( const TIntVector& ib ) { ++polygonCount; TIntVector::const_iterator vit, vitEnd = ib.end(); for( vit = ib.begin(); vit != vitEnd; ++vit ) { int idx = *vit; assert( idx >= 0 && idx < vertexUseCount.size() ); vertices.insert( idx ); ++vertexUseCount[idx]; int idxNext = (vit==vitEnd-1) ? ib.front() : *(vit+1); int idxPrev = (vit==ib.begin()) ? ib.back() : *(vit-1); vertexNexts[idx].push_back( idxNext ); vertexPrevs[idx].push_back( idxPrev ); } }