diff --git a/SurfTriMesh.cpp b/SurfTriMesh.cpp index e510421..512ac55 100644 --- a/SurfTriMesh.cpp +++ b/SurfTriMesh.cpp @@ -1452,6 +1452,139 @@ SurfTriMesh::AdjustTopology( void) return true ; } +//---------------------------------------------------------------------------- +bool +SurfTriMesh::PackVertices( void) +{ + // compatto, sovrascrivendo eventuali vertici cancellati + INTVECTOR vVId ; + vVId.reserve( GetVertexSize()) ; + int nFirstFree = SVT_NULL ; + for ( int nId = 0 ; nId < GetVertexSize() ; ++ nId) { + if ( m_vVert[nId].nIdTria != SVT_DEL) { + if ( nFirstFree != SVT_NULL) { + vVId.push_back( nFirstFree) ; + m_vVert[nFirstFree] = m_vVert[nId] ; + m_vVert[nId].nIdTria = SVT_DEL ; + ++ nFirstFree ; + } + else + vVId.push_back( nId) ; + } + else { + if ( nFirstFree == SVT_NULL) + nFirstFree = nId ; + vVId.push_back( SVT_DEL) ; + } + } + // se non c'è stata compattazione, esco + if ( nFirstFree == SVT_NULL) + return true ; + // lunghezza vettore indici vertici + int nVIdSize = int( vVId.size()) ; + // aggiorno gli indici ai vertici dai triangoli + for ( int nId = 0 ; nId < GetTriangleSize() ; ++ nId) { + // recupero gli indici dei vertici del triangolo + int vOId[3] ; + vOId[0] = m_vTria[nId].nIdVert[0] ; + vOId[1] = m_vTria[nId].nIdVert[1] ; + vOId[2] = m_vTria[nId].nIdVert[2] ; + // salto i triangoli cancellati + if ( vOId[0] == SVT_DEL) + continue ; + // verifico la validità degli indici + if ( vOId[0] < 0 || vOId[0] >= nVIdSize || + vOId[1] < 0 || vOId[1] >= nVIdSize || + vOId[2] < 0 || vOId[2] >= nVIdSize) + return false ; + // aggiorno il triangolo + m_vTria[nId].nIdVert[0] = vVId[vOId[0]] ; + m_vTria[nId].nIdVert[1] = vVId[vOId[1]] ; + m_vTria[nId].nIdVert[2] = vVId[vOId[2]] ; + } + // ridimensiono l'array dei vertici + m_vVert.resize( nFirstFree) ; + return true ; +} + +//---------------------------------------------------------------------------- +bool +SurfTriMesh::PackTriangles( void) +{ + // compatto, sovrascrivendo eventuali triangoli cancellati + INTVECTOR vTId ; + vTId.reserve( GetTriangleSize()) ; + int nFirstFree = SVT_NULL ; + for ( int nId = 0 ; nId < GetTriangleSize() ; ++ nId) { + if ( m_vTria[nId].nIdVert[0] != SVT_DEL) { + if ( nFirstFree != SVT_NULL) { + vTId.push_back( nFirstFree) ; + m_vTria[nFirstFree] = m_vTria[nId] ; + m_vTria[nId].nIdVert[0] = SVT_DEL ; + ++ nFirstFree ; + } + else + vTId.push_back( nId) ; + } + else { + if ( nFirstFree == SVT_NULL) + nFirstFree = nId ; + vTId.push_back( SVT_DEL) ; + } + } + // se non c'è stata compattazione, esco + if ( nFirstFree == SVT_NULL) + return true ; + // lunghezza vettore indici triangoli + int nTIdSize = int( vTId.size()) ; + // aggiorno gli indici ai triangoli dai vertici + for ( int nId = 0 ; nId < GetVertexSize() ; ++ nId) { + // recupero indice dal vertice a triangolo + int nOId = m_vVert[nId].nIdTria ; + // salto vertice cancellato + if ( nOId == SVT_DEL) + continue ; + // verifico la validità dell'indice + if ( nOId < 0 || nOId >= nTIdSize) + return false ; + // aggiorno + m_vVert[nId].nIdTria = vTId[nOId] ; + } + // aggiorno gli indici ai triangoli dai triangoli (adiacenze) + for ( int nId = 0 ; nId < GetTriangleSize() ; ++ nId) { + // salto i triangoli cancellati + if ( m_vTria[nId].nIdVert[0] == SVT_DEL) + continue ; + // recupero gli indici dei triangoli adiacenti + int vOId[3] ; + vOId[0] = m_vTria[nId].nIdAdjac[0] ; + vOId[1] = m_vTria[nId].nIdAdjac[1] ; + vOId[2] = m_vTria[nId].nIdAdjac[2] ; + // aggiorno opportunamente ogni indice + for ( int j = 0 ; j < 3 ; ++ j) { + if ( vOId[j] == SVT_NULL) + continue ; + if ( vOId[j] < 0 || vOId[j] >= nTIdSize) + return false ; + m_vTria[nId].nIdAdjac[j] = vTId[vOId[j]] ; + } + } + // aggiorno gli indici ai triangoli dalle facets + for ( int nId = 0 ; m_bFaceted && nId < GetFacetSize() ; ++ nId) { + // salto le facets non valide + if ( m_vFacet[nId] == SVT_DEL) + continue ; + // verifico validità indice a triangolo + if ( m_vFacet[nId] < 0 || m_vFacet[nId] >= nTIdSize) + return false ; + // aggiorno + m_vFacet[nId] = vTId[m_vFacet[nId]] ; + } + // ridimensiono l'array dei triangoli + m_vTria.resize( nFirstFree) ; + return true ; +} + //---------------------------------------------------------------------------- bool SurfTriMesh::CreateByFlatContour( const PolyLine& PL) @@ -2247,9 +2380,17 @@ SurfTriMesh::DoCompacting( void) RemoveTriangle( nId) ; } + // compatto il vettore dei vertici + if ( ! PackVertices()) + return false ; + // ricalcolo le adiacenze m_nStatus = TO_VERIFY ; - return AdjustTopology() ; + if ( ! AdjustTopology()) + return false ; + + // compatto il vettore dei triangoli + return PackTriangles() ; } //---------------------------------------------------------------------------- @@ -2331,9 +2472,17 @@ SurfTriMesh::DoSewing( const ISurfTriMesh& stmOther, const Frame3d& frOther) } } + // compatto il vettore dei vertici + if ( ! PackVertices()) + return false ; + // ricalcolo le adiacenze m_nStatus = TO_VERIFY ; - return AdjustTopology() ; + if ( ! AdjustTopology()) + return false ; + + // compatto il vettore dei triangoli + return PackTriangles() ; } //---------------------------------------------------------------------------- diff --git a/SurfTriMesh.h b/SurfTriMesh.h index d1ae33f..07ff72b 100644 --- a/SurfTriMesh.h +++ b/SurfTriMesh.h @@ -213,6 +213,8 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW bool AdjustOrientations( void) ; bool AdjustTriaOrientation( TRINTDEQUE& S3iQ) ; bool TestSealing( void) ; + bool PackVertices( void) ; + bool PackTriangles( void) ; bool SetVertex( int nInd, const StmVert& vV) ; bool SetTriangle( int nInd, const StmTria& tT) ; bool CalcTriangleNormal( int nT) ;