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:
Dario Sassi
2019-11-23 17:25:16 +00:00
parent ff1a7a23c5
commit 29694209fa
3 changed files with 46 additions and 57 deletions
+25 -45
View File
@@ -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()) ;
}