EgtGeomKernel :
- a TriMesh aggiunta eliminazione vertici e triangoli cancellati con compattazione vettori relativi.
This commit is contained in:
+151
-2
@@ -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() ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user