EgtGeomKernel :

- a TriMesh aggiunta eliminazione vertici e triangoli cancellati con compattazione vettori relativi.
This commit is contained in:
Dario Sassi
2017-09-01 07:02:50 +00:00
parent c8a38f5aae
commit cb4512bda0
2 changed files with 153 additions and 2 deletions
+151 -2
View File
@@ -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() ;
}
//----------------------------------------------------------------------------