EgtGeomKernel :
- in Stm aggiunto controllo che i triangoli aggiunti abbiano altezza minima superiore a EPS_TRIA_H = 1e-6 - modifiche e correzioni a booleane di Stm.
This commit is contained in:
+20
-11
@@ -145,7 +145,11 @@ SurfTriMesh::AddTriangle( const int nIdVert[3])
|
||||
Vector3d vtV2 = m_vVert[nIdVert[2]].ptP - m_vVert[nIdVert[1]].ptP ;
|
||||
// normale da prodotto vettoriale
|
||||
Vector3d vtN = vtV1 ^ vtV2 ;
|
||||
if ( vtN.IsZero())
|
||||
double dSqN = vtN.SqLen() ;
|
||||
if ( dSqN < SQ_EPS_ZERO)
|
||||
return SVT_DEL ;
|
||||
// verifico la distanza minima tra i vertici e i lati opposti
|
||||
if ( dSqN < SQ_EPS_TRIA_H * max( { vtV1.SqLen(), vtV2.SqLen(), ( vtV1 + vtV2).SqLen()}))
|
||||
return SVT_DEL ;
|
||||
// imposto ricalcolo
|
||||
m_nStatus = TO_VERIFY ;
|
||||
@@ -1643,7 +1647,7 @@ SurfTriMesh::PackTriangles( void)
|
||||
continue ;
|
||||
if ( vOId[j] < 0 || vOId[j] >= nTIdSize)
|
||||
return false ;
|
||||
m_vTria[nId].nIdAdjac[j] = vTId[vOId[j]] ;
|
||||
m_vTria[nId].nIdAdjac[j] = ( vTId[vOId[j]] == SVT_DEL ? SVT_NULL : vTId[vOId[j]]) ;
|
||||
}
|
||||
}
|
||||
// aggiorno gli indici ai triangoli dalle facets
|
||||
@@ -1846,7 +1850,7 @@ SurfTriMesh::CreateByPointCurve( const Point3d& ptP, const PolyLine& PL)
|
||||
// inserisco il triangolo A2p -> A1p -> A1s
|
||||
if ( AddTriangle( nIdV) == SVT_NULL)
|
||||
return false ;
|
||||
// aggirono indice punto precedente su curva
|
||||
// aggiorno indice punto precedente su curva
|
||||
nIdV[1] = nIdV[2] ;
|
||||
}
|
||||
// se chiusa aggiungo l'ultimo triangolo (non il vertice perchè è il primo della curva)
|
||||
@@ -3284,9 +3288,10 @@ SurfTriMesh::Cut( const Plane3d& plPlane, bool bSaveOnEq)
|
||||
int nIdVert[3] = { m_vTria[i].nIdVert[0], m_vTria[i].nIdVert[1], m_vTria[i].nIdVert[2]} ;
|
||||
nIdVert[nVertOut] = nNewV ;
|
||||
int nIdTria = AddTriangle( nIdVert) ;
|
||||
if ( ! IsValidSvt( nIdTria))
|
||||
if ( nIdTria == SVT_NULL)
|
||||
return false ;
|
||||
m_vTria[nIdTria].nTemp = m_nTimeStamp ;
|
||||
if ( nIdTria != SVT_DEL)
|
||||
m_vTria[nIdTria].nTemp = m_nTimeStamp ;
|
||||
// cancello il vecchio triangolo
|
||||
RemoveTriangle( i) ;
|
||||
}
|
||||
@@ -3327,9 +3332,10 @@ SurfTriMesh::Cut( const Plane3d& plPlane, bool bSaveOnEq)
|
||||
nIdVert[nVertOut1] = nNewV1 ;
|
||||
nIdVert[nVertOut2] = nNewV2 ;
|
||||
int nIdTria = AddTriangle( nIdVert) ;
|
||||
if ( ! IsValidSvt( nIdTria))
|
||||
if ( nIdTria == SVT_NULL)
|
||||
return false ;
|
||||
m_vTria[nIdTria].nTemp = m_nTimeStamp ;
|
||||
if ( nIdTria != SVT_DEL)
|
||||
m_vTria[nIdTria].nTemp = m_nTimeStamp ;
|
||||
// cancello il vecchio triangolo
|
||||
RemoveTriangle( i) ;
|
||||
}
|
||||
@@ -3382,10 +3388,12 @@ SurfTriMesh::Cut( const Plane3d& plPlane, bool bSaveOnEq)
|
||||
}
|
||||
int nIdTria1 = AddTriangle( nIdVert1) ;
|
||||
int nIdTria2 = AddTriangle( nIdVert2) ;
|
||||
if ( ! IsValidSvt( nIdTria1) || ! IsValidSvt( nIdTria2))
|
||||
if ( nIdTria1 == SVT_NULL || nIdTria2 == SVT_NULL)
|
||||
return false ;
|
||||
m_vTria[nIdTria1].nTemp = m_nTimeStamp ;
|
||||
m_vTria[nIdTria2].nTemp = m_nTimeStamp ;
|
||||
if ( nIdTria1 != SVT_DEL)
|
||||
m_vTria[nIdTria1].nTemp = m_nTimeStamp ;
|
||||
if ( nIdTria2 != SVT_DEL)
|
||||
m_vTria[nIdTria2].nTemp = m_nTimeStamp ;
|
||||
// cancello il vecchio triangolo
|
||||
RemoveTriangle( i) ;
|
||||
}
|
||||
@@ -3579,7 +3587,8 @@ SurfTriMesh::ClonePart( int nPart) const
|
||||
int nNewInd[3] = { pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[0]].ptP),
|
||||
pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[1]].ptP),
|
||||
pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[2]].ptP)} ;
|
||||
pSurfTM->AddTriangle( nNewInd) ;
|
||||
if ( pSurfTM->AddTriangle( nNewInd) == SVT_NULL)
|
||||
return nullptr ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user