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 ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -291,7 +291,7 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW
|
||||
void ResetHashGrids3d( void) const ;
|
||||
bool VerifyHashGrids3d( void) const ;
|
||||
bool VerifyConnection( void) const ;
|
||||
bool DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, std::vector<PNTVECTOR>& cvBoundClosedLoopVec, BOOLVECTOR& vbInOut) ;
|
||||
bool DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, PNTMATRIX& cvBoundClosedLoopVec, BOOLVECTOR& vbInOut) ;
|
||||
bool IntersectTriMeshTriangle( SurfTriMesh& Other) ;
|
||||
bool IdentifyParts( void) const ;
|
||||
bool RemoveTJunction( void) ;
|
||||
|
||||
+25
-45
@@ -32,7 +32,7 @@
|
||||
using namespace std ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
static int
|
||||
IntersRectangleTriangle( const Point3d& ptP, const Vector3d& vtL1, const Vector3d& vtL2,
|
||||
const Triangle3d& trTria, Point3d& ptStSeg, Point3d& ptEnSeg)
|
||||
{
|
||||
@@ -116,7 +116,7 @@ IntersRectangleTriangle( const Point3d& ptP, const Vector3d& vtL1, const Vector3
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
static bool
|
||||
ChangeStart( const Point3d& ptNewStart, PNTVECTOR& Loop)
|
||||
{
|
||||
// Cerco se esiste un tratto del loop chiuso su cui giace il punto
|
||||
@@ -178,7 +178,7 @@ ChangeStart( const Point3d& ptNewStart, PNTVECTOR& Loop)
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
static bool
|
||||
SplitAtPoint( const Point3d& ptStop, const PNTVECTOR& Loop, PNTVECTOR& Loop1, PNTVECTOR& Loop2)
|
||||
{
|
||||
// Cerco se esiste un tratto del loop chiuso su cui giace il punto
|
||||
@@ -224,7 +224,7 @@ SplitAtPoint( const Point3d& ptStop, const PNTVECTOR& Loop, PNTVECTOR& Loop1, PN
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
static bool
|
||||
AddChainToChain( const Chain& ChainToAdd, PNTVECTOR& OrigChain)
|
||||
{
|
||||
// Se la catena da aggiungere è vuota, non devo fare alcunchè
|
||||
@@ -253,20 +253,6 @@ AddChainToChain( const Chain& ChainToAdd, PNTVECTOR& OrigChain)
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
/*else if ( AreSamePointApprox( OrigChain[0], ChainToAdd[nLastToAdd].ptEn)) {
|
||||
int nOldDim = OrigChain.size() ;
|
||||
int nNewDim = nOldDim + ChainToAdd.size() + 1 ;
|
||||
OrigChain.resize( nNewDim) ;
|
||||
int nShift = std::max( nNewDim - nOldDim, 0) ;
|
||||
for ( int nPt = nOldDim - 1 ; nPt >= 0 ; -- nPt) {
|
||||
OrigChain[nPt + nShift] = OrigChain[nPt] ;
|
||||
}
|
||||
for ( int nPt = 0 ; nPt < int( ChainToAdd.size()) ; ++ nPt) {
|
||||
OrigChain[nPt] = ChainToAdd[nPt].ptSt ;
|
||||
}
|
||||
OrigChain[int( ChainToAdd.size())] = ChainToAdd[int(ChainToAdd.size()) - 1].ptEn ;
|
||||
return true ;
|
||||
}*/
|
||||
else
|
||||
return false ;
|
||||
}
|
||||
@@ -541,7 +527,7 @@ SurfTriMesh::GeneralizedCut( const ICurve& cvCurve, bool bSaveOnEq)
|
||||
cvFirstLoop.emplace_back( trTria.GetP( 1)) ;
|
||||
cvFirstLoop.emplace_back( trTria.GetP( 2)) ;
|
||||
|
||||
vector<PNTVECTOR> cvBoundClosedLoopVec ;
|
||||
PNTMATRIX cvBoundClosedLoopVec ;
|
||||
cvBoundClosedLoopVec.emplace_back(cvFirstLoop);
|
||||
BOOLVECTOR vbInOut ;
|
||||
vbInOut.push_back( true) ;
|
||||
@@ -741,7 +727,7 @@ SurfTriMesh::GeneralizedCut( const ICurve& cvCurve, bool bSaveOnEq)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
SurfTriMesh::DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, vector<PNTVECTOR>& cvBoundClosedLoopVec, BOOLVECTOR& vbInOut)
|
||||
SurfTriMesh::DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, PNTMATRIX& cvBoundClosedLoopVec, BOOLVECTOR& vbInOut)
|
||||
{
|
||||
// Divido il loop di partenza in sotto-loop
|
||||
int nIterationCount = 0 ;
|
||||
@@ -934,11 +920,11 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
if ( m_nStatus != OK || ! SurfB.IsValid())
|
||||
return false ;
|
||||
// Unordered map dei segmenti di intersezione
|
||||
std::unordered_map <int, Chain> LineMapA ;
|
||||
std::unordered_map <int, Chain> LineMapB ;
|
||||
unordered_map< int, Chain> LineMapA ;
|
||||
unordered_map< int, Chain> LineMapB ;
|
||||
// Unordered map dei triangoli ambigui (intersezione edge-edge)
|
||||
std::unordered_map <int, std::vector <Triangle3d>> AmbiguosA ;
|
||||
std::unordered_map <int, std::vector <Triangle3d>> AmbiguosB ;
|
||||
unordered_map< int, TRIA3DVECTOR> AmbiguosA ;
|
||||
unordered_map< int, TRIA3DVECTOR> AmbiguosB ;
|
||||
// Ciclo sui triangoli delle mesh
|
||||
int nTriaNumA = GetTriangleSize() ;
|
||||
int nTriaNumB = SurfB.GetTriangleSize() ;
|
||||
@@ -1059,7 +1045,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
else if ( bIntOnEndgeA && bIntOnEndgeB) {
|
||||
auto itA = AmbiguosA.find( nTA) ;
|
||||
if ( itA == AmbiguosA.end()) {
|
||||
std::vector <Triangle3d> vVecTriaB ;
|
||||
TRIA3DVECTOR vVecTriaB ;
|
||||
vVecTriaB.emplace_back( trTriaB) ;
|
||||
AmbiguosA.emplace( nTA, vVecTriaB) ;
|
||||
}
|
||||
@@ -1068,7 +1054,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
}
|
||||
auto itB = AmbiguosB.find( nTB) ;
|
||||
if ( itB == AmbiguosB.end()) {
|
||||
std::vector <Triangle3d> vVecTriaA ;
|
||||
TRIA3DVECTOR vVecTriaA ;
|
||||
vVecTriaA.emplace_back( trTriaA) ;
|
||||
AmbiguosB.emplace( nTB, vVecTriaA) ;
|
||||
}
|
||||
@@ -1094,7 +1080,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
it->second.erase( it->second.begin() + nS2) ;
|
||||
it->second.erase( it->second.begin() + nS1) ;
|
||||
-- nS1 ;
|
||||
-- nS2 ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1242,7 +1228,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
cvFirstLoop.emplace_back( trTriaA.GetP( 1)) ;
|
||||
cvFirstLoop.emplace_back( trTriaA.GetP( 2)) ;
|
||||
|
||||
vector<PNTVECTOR> cvBoundClosedLoopVec ;
|
||||
PNTMATRIX cvBoundClosedLoopVec ;
|
||||
cvBoundClosedLoopVec.emplace_back( cvFirstLoop) ;
|
||||
BOOLVECTOR vbInOut ;
|
||||
vbInOut.push_back( true) ;
|
||||
@@ -1264,7 +1250,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
// Assumo che i loop interni a uno dei loop creati fino ad'ora siano tutti sullo stesso livello.
|
||||
// Il caso generale si risolve con una struttura ad albero in cui il nodi corrispondente a un
|
||||
// loop è figlio del nodo corrispondente al loop che lo contiene.
|
||||
vector<int> vInnerLoop ;
|
||||
INTVECTOR vInnerLoop ;
|
||||
for ( int nCLI = 0 ; nCLI < int( cvClosedChain.size()) ; ++ nCLI) {
|
||||
Point3d ptLoopStart = cvClosedChain[nCLI][0].ptSt ;
|
||||
double dMinDist = DBL_MAX ;
|
||||
@@ -1499,7 +1485,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
it->second.erase( it->second.begin() + nS2) ;
|
||||
it->second.erase( it->second.begin() + nS1) ;
|
||||
-- nS1 ;
|
||||
-- nS2 ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1648,7 +1634,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
cvFirstLoop.emplace_back( trTriaB.GetP( 1)) ;
|
||||
cvFirstLoop.emplace_back( trTriaB.GetP( 2)) ;
|
||||
|
||||
vector<PNTVECTOR> cvBoundClosedLoopVec ;
|
||||
PNTMATRIX cvBoundClosedLoopVec ;
|
||||
cvBoundClosedLoopVec.emplace_back( cvFirstLoop) ;
|
||||
BOOLVECTOR vbInOut ;
|
||||
vbInOut.push_back( true) ;
|
||||
@@ -1669,7 +1655,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
// Assumo che i loop interni a uno dei loop creati fino ad'ora siano tutti sullo stesso livello.
|
||||
// Il caso generale si risolve con una struttura ad albero in cui il nodi corrispondente a un
|
||||
// loop è figlio del nodo corrispondente al loop che lo contiene.
|
||||
vector<int> vInnerLoop ;
|
||||
INTVECTOR vInnerLoop ;
|
||||
for ( int nCLI = 0 ; nCLI < int( cvClosedChain.size()) ; ++ nCLI) {
|
||||
Point3d ptLoopStart = cvClosedChain[nCLI][0].ptSt ;
|
||||
double dMinDist = DBL_MAX ;
|
||||
@@ -2126,7 +2112,7 @@ SurfTriMesh::RemoveTJunction( void)
|
||||
Tria.nTemp = m_nTimeStamp ;
|
||||
// Incremento time stamp
|
||||
++ m_nTimeStamp ;
|
||||
std::vector<INTVECTOR> IndexesMatrix ;
|
||||
INTMATRIX IndexesMatrix ;
|
||||
for ( int nT = 0 ; nT < int( m_vTria.size()) ; ++ nT) {
|
||||
// Se il triangolo non è valido, continuo.
|
||||
Triangle3d trTria ;
|
||||
@@ -2410,11 +2396,9 @@ SurfTriMesh::Add( const ISurfTriMesh& Other)
|
||||
AddTriangle( nNewVert) ;
|
||||
}
|
||||
}
|
||||
bool bContinue = ( AdjustVertices() && DoCompacting()) ;
|
||||
if ( bContinue)
|
||||
RemoveTJunction() ;
|
||||
else
|
||||
if ( ! AdjustVertices() || ! DoCompacting())
|
||||
return false ;
|
||||
RemoveTJunction() ;
|
||||
return ( AdjustVertices() && DoCompacting()) ;
|
||||
}
|
||||
|
||||
@@ -2442,11 +2426,9 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other)
|
||||
AddTriangle( nNewVert) ;
|
||||
}
|
||||
}
|
||||
bool bContinue = ( AdjustVertices() && DoCompacting()) ;
|
||||
if ( bContinue)
|
||||
RemoveTJunction() ;
|
||||
else
|
||||
if ( ! AdjustVertices() || ! DoCompacting())
|
||||
return false ;
|
||||
RemoveTJunction() ;
|
||||
return ( AdjustVertices() && DoCompacting()) ;
|
||||
}
|
||||
|
||||
@@ -2475,11 +2457,9 @@ SurfTriMesh::Subtract( const ISurfTriMesh& Other)
|
||||
AddTriangle( nNewVert) ;
|
||||
}
|
||||
}
|
||||
bool bContinue = ( AdjustVertices() && DoCompacting()) ;
|
||||
if ( bContinue)
|
||||
RemoveTJunction() ;
|
||||
else
|
||||
if ( ! AdjustVertices() || ! DoCompacting())
|
||||
return false ;
|
||||
RemoveTJunction() ;
|
||||
return ( AdjustVertices() && DoCompacting()) ;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user