EgtGeomKernel 2.5g1 :

- aggiunta funzione GetSurfTmNearestVertex
- a SurfTriMesh aggiunti metodi MoveVertex e GetAllVertInFacet
- corretta DoCompacting di SurfTriMesh aggiungendo verifica del calcolo della normale dei triangoli.
This commit is contained in:
DarioS
2023-07-07 17:04:15 +02:00
parent b5b48bf4c2
commit e4815830cd
7 changed files with 177 additions and 46 deletions
+37 -16
View File
@@ -121,6 +121,27 @@ SurfTriMesh::AddVertex( const Point3d& ptVert)
return int( m_vVert.size() - 1) ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::MoveVertex( int nInd, const Point3d& ptNewVert)
{
// verifico validità indice
if ( nInd < 0 || nInd >= int( m_vVert.size()))
return false ;
// verifico non sia già cancellato
if ( m_vVert[nInd].nIdTria == SVT_DEL)
return false ;
// sposto il vertice
m_vVert[nInd].ptP = ptNewVert ;
// imposto ricalcolo
m_nStatus = TO_VERIFY ;
m_nParts = - 1 ;
m_OGrMgr.Reset() ;
ResetHashGrids3d() ;
// per aggiornare completamente la superficie chiamare DoCompacting
return true ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::SetVertex( int nInd, const StmVert& vV)
@@ -758,23 +779,23 @@ SurfTriMesh::GetTriangleAdjacencies( int nId, int nIdAdjTriaId[3]) const
//----------------------------------------------------------------------------
bool
SurfTriMesh::GetTriangleFlag( int nId, int& nFlag) const
SurfTriMesh::GetTFlag( int nTriaId, int& nTFlag) const
{
// verifico esistenza del triangolo
if ( nId < 0 || nId >= GetTriangleSize() || m_vTria[nId].nIdVert[0] == SVT_DEL)
if ( nTriaId < 0 || nTriaId >= GetTriangleSize() || m_vTria[nTriaId].nIdVert[0] == SVT_DEL)
return false ;
nFlag = m_vTria[nId].nTFlag ;
nTFlag = m_vTria[nTriaId].nTFlag ;
return true ;
}
//----------------------------------------------------------------------------
bool
SurfTriMesh::GetTriangleTempInt( int nId, int& nTempInt) const
SurfTriMesh::GetTempInt( int nTriaId, int& nTempInt) const
{
// verifico esistenza del triangolo
if ( nId < 0 || nId >= GetTriangleSize() || m_vTria[nId].nIdVert[0] == SVT_DEL)
if ( nTriaId < 0 || nTriaId >= GetTriangleSize() || m_vTria[nTriaId].nIdVert[0] == SVT_DEL)
return false ;
nTempInt = m_vTria[nId].nTemp ;
nTempInt = m_vTria[nTriaId].nTemp ;
return true ;
}
@@ -2950,14 +2971,13 @@ SurfTriMesh::DoCompacting( double dTol)
// sistemo gli indici dei vertici nei 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)
if ( m_vTria[nId].nIdVert[0] == SVT_DEL)
continue ;
// recupero gli indici dei vertici del triangolo
int vOId[3]{ m_vTria[nId].nIdVert[0],
m_vTria[nId].nIdVert[1],
m_vTria[nId].nIdVert[2]} ;
// verifico la validità degli indici
if ( vOId[0] < 0 || vOId[0] >= nVIdSize ||
vOId[1] < 0 || vOId[1] >= nVIdSize ||
@@ -2967,11 +2987,12 @@ SurfTriMesh::DoCompacting( double dTol)
m_vTria[nId].nIdVert[0] = vVId[vOId[0]] ;
m_vTria[nId].nIdVert[1] = vVId[vOId[1]] ;
m_vTria[nId].nIdVert[2] = vVId[vOId[2]] ;
// se due vertici coincidono, cancello il triangolo
// se due vertici coincidono o la normale non è calcolabile, cancello il triangolo
if ( m_vTria[nId].nIdVert[0] == m_vTria[nId].nIdVert[1] ||
m_vTria[nId].nIdVert[0] == m_vTria[nId].nIdVert[2] ||
m_vTria[nId].nIdVert[1] == m_vTria[nId].nIdVert[2])
RemoveTriangle( nId) ;
m_vTria[nId].nIdVert[1] == m_vTria[nId].nIdVert[2] ||
! CalcTriangleNormal( nId))
RemoveTriangle( nId) ;
}
// compatto il vettore dei vertici
@@ -3662,7 +3683,7 @@ SurfTriMesh::ResetTFlags( void)
//----------------------------------------------------------------------------
bool
SurfTriMesh::ResetTempInt( void) const
SurfTriMesh::ResetTempInts( void) const
{
for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i)
m_vTria[i].nTemp = 0 ;