EgtGeomKernel :
- piccole migliorie sintattiche a Booleane di TriMesh.
This commit is contained in:
+33
-57
@@ -731,9 +731,9 @@ SurfTriMesh::GeneralizedCut( const ICurve& cvCurve, bool bSaveOnEq)
|
||||
bool
|
||||
SurfTriMesh::DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, PNTMATRIX& cvBoundClosedLoopVec, BOOLVECTOR& vbInOut)
|
||||
{
|
||||
// Divido il loop di partenza in sotto-loop
|
||||
// Divido il loop di partenza in sotto-loop
|
||||
int nIterationCount = 0 ;
|
||||
while ( cvOpenChain.size() > 0) {
|
||||
while ( cvOpenChain.size() > 0) {
|
||||
bool bLoopSplitted = false ;
|
||||
int nLastOpenLoopN = int( cvOpenChain.size()) - 1 ;
|
||||
if ( vnDegVec[nLastOpenLoopN] == 1) {
|
||||
@@ -746,8 +746,8 @@ SurfTriMesh::DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, PNTMA
|
||||
bool bChangedStart = ChangeStart( ptOpenLoopStP, cvBoundClosedLoopVec[nLoop]) ;
|
||||
bool bSplitted = SplitAtPoint( ptOpenLoopEnP, cvBoundClosedLoopVec[nLoop], Loop1, Loop2) ;
|
||||
if ( ! ( bChangedStart && bSplitted))
|
||||
continue ;
|
||||
bLoopSplitted = true ;
|
||||
continue ;
|
||||
bLoopSplitted = true ;
|
||||
Chain cvCounterChain ;
|
||||
for ( int nPt = int( cvOpenChain[nLastOpenLoopN].size()) - 1 ; nPt >= 0 ; -- nPt) {
|
||||
IntSegment CurSeg ;
|
||||
@@ -883,9 +883,9 @@ SurfTriMesh::DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, PNTMA
|
||||
vbInOut[nLoop] = bC21 ;
|
||||
}
|
||||
bLoopSplitted = true ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( ! bLoopSplitted) {
|
||||
int nCurDeg = vnDegVec[nLastOpenLoopN] ;
|
||||
vnDegVec.emplace( vnDegVec.begin(), nCurDeg) ;
|
||||
@@ -903,11 +903,11 @@ SurfTriMesh::DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, PNTMA
|
||||
++ nIterationCount ;
|
||||
}
|
||||
else
|
||||
nIterationCount = 0 ;
|
||||
nIterationCount = 0 ;
|
||||
vnDegVec.resize( nLastOpenLoopN) ;
|
||||
cvOpenChain.resize( nLastOpenLoopN) ;
|
||||
if ( nIterationCount > int( cvOpenChain.size()) + 2)
|
||||
return false ;
|
||||
return false ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
@@ -1318,7 +1318,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
vInnerLoop.resize( 0) ;
|
||||
}
|
||||
@@ -1328,7 +1328,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
SurfTriMesh::AmbiguosTriangleHandler( TRIA3DVECTORMAP& Ambiguos, SurfTriMesh& Surf)
|
||||
SurfTriMesh::AmbiguosTriangleManager( TRIA3DVECTORMAP& Ambiguos, SurfTriMesh& Surf)
|
||||
{
|
||||
for ( auto it = Ambiguos.begin() ; it != Ambiguos.end() ; ++ it) {
|
||||
Triangle3d trTria ;
|
||||
@@ -1341,10 +1341,8 @@ SurfTriMesh::AmbiguosTriangleHandler( TRIA3DVECTORMAP& Ambiguos, SurfTriMesh& Su
|
||||
Triangle3d trOthSurfTria = it->second[nOthSurfT] ;
|
||||
double dDot = ( ptBar - trOthSurfTria.GetP( 0)) * trOthSurfTria.GetN() ;
|
||||
if ( abs( dDot) > EPS_SMALL) {
|
||||
DistPointTriangle DistCalc( ptBar, trOthSurfTria) ;
|
||||
double dDist ;
|
||||
DistCalc.GetDist( dDist) ;
|
||||
if ( dDist < dMinDist) {
|
||||
if ( DistPointTriangle( ptBar, trOthSurfTria).GetDist( dDist) && dDist < dMinDist) {
|
||||
nTriaIndex = nOthSurfT ;
|
||||
dMinDist = dDist ;
|
||||
}
|
||||
@@ -1385,11 +1383,10 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
SurfB.m_vTria[nTB].nTempPart = 0 ;
|
||||
// Resetto e ricalcolo la HashGrid della superficie B
|
||||
SurfB.ResetHashGrids3d() ;
|
||||
SurfB.VerifyHashGrids3d() ;
|
||||
for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) {
|
||||
// Se il triangolo A non è valido, continuo
|
||||
Triangle3d trTriaA ;
|
||||
if ( ! ( GetTriangle( nTA, trTriaA) && trTriaA.Validate( true)))
|
||||
if ( ! GetTriangle( nTA, trTriaA) || ! trTriaA.Validate( true))
|
||||
continue ;
|
||||
// Box del triangolo A
|
||||
BBox3d b3dTriaA ;
|
||||
@@ -1401,22 +1398,16 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
for ( int nTB = 0 ; nTB < int( vNearTria.size()) ; ++ nTB) {
|
||||
// Se il triangolo B non è valido, continuo
|
||||
Triangle3d trTriaB ;
|
||||
if ( ! ( SurfB.GetTriangle( vNearTria[nTB], trTriaB) && trTriaB.Validate( true)))
|
||||
continue ;
|
||||
// Box del triangolo B
|
||||
BBox3d b3dTriaB ;
|
||||
trTriaB.GetLocalBBox( b3dTriaB) ;
|
||||
// Se i box non si sovrappongono, contiuno
|
||||
if ( ! b3dTriaA.Overlaps( b3dTriaB))
|
||||
if ( ! SurfB.GetTriangle( vNearTria[nTB], trTriaB) || ! trTriaB.Validate( true))
|
||||
continue ;
|
||||
// Interseco i triangoli
|
||||
if ( abs( trTriaA.GetN() * trTriaB.GetN()) < 1 - EPS_ZERO) {
|
||||
Point3d ptSegSt, ptSegEn ;
|
||||
TRIA3DVECTOR vTria ;
|
||||
int nIntType = IntersTriaTria( trTriaA, trTriaB, ptSegSt, ptSegEn, vTria) ;
|
||||
if ( ! ( FromSpecialToNormal( nIntType) == ITTT_NO ||
|
||||
FromSpecialToNormal( nIntType) == ITTT_OVERLAPS ||
|
||||
FromSpecialToNormal( nIntType) == ITTTS_VERT_VERT)) {
|
||||
if ( FromSpecialToNormal( nIntType) != ITTT_NO &&
|
||||
FromSpecialToNormal( nIntType) != ITTT_OVERLAPS &&
|
||||
FromSpecialToNormal( nIntType) != ITTTS_VERT_VERT) {
|
||||
// Assegno i dati di intersezione
|
||||
IntSegment CurInters ;
|
||||
if ( FromSpecialToNormal( nIntType) == ITTT_EDGE || FromSpecialToNormal( nIntType) == ITTT_YES) {
|
||||
@@ -1434,7 +1425,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
CurInters.vtOuter.Normalize() ;
|
||||
// Salvo intersezione per superficie A
|
||||
bool bIntOnEndgeA = false ;
|
||||
if ( ! ( nIntType == ITTTS_EDGE_EDGE_SEG || nIntType == ITTTS_EDGE_INT)) {
|
||||
if ( nIntType != ITTTS_EDGE_EDGE_SEG && nIntType != ITTTS_EDGE_INT) {
|
||||
auto itA = LineMapA.find( nTA) ;
|
||||
if ( itA != LineMapA.end()) {
|
||||
itA->second.emplace_back( CurInters) ;
|
||||
@@ -1454,7 +1445,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
|
||||
// Salvo intersezione per superficie B
|
||||
bool bIntOnEndgeB = false ;
|
||||
if ( ! ( nIntType == ITTTS_EDGE_EDGE_SEG || nIntType == ITTTS_INT_EDGE)) {
|
||||
if ( nIntType != ITTTS_EDGE_EDGE_SEG && nIntType != ITTTS_INT_EDGE) {
|
||||
auto itB = LineMapB.find( vNearTria[nTB]) ;
|
||||
if ( itB != LineMapB.end()) {
|
||||
itB->second.emplace_back( CurInters) ;
|
||||
@@ -1476,7 +1467,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
if ( dMaxDist < dDist) {
|
||||
nSegMaxDist = nVA ;
|
||||
dMaxDist = dDist ;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( nSegMaxDist >= 0) {
|
||||
m_vTria[nTA].nTempPart = ( ( trTriaA.GetP( nSegMaxDist) - trTriaB.GetP( 0)) * trTriaB.GetN() < - EPS_SMALL ? 1 : - 1) ;
|
||||
@@ -1491,7 +1482,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
if ( dMaxDist < dDist) {
|
||||
nSegMaxDist = nVB ;
|
||||
dMaxDist = dDist ;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( nSegMaxDist >= 0) {
|
||||
SurfB.m_vTria[vNearTria[nTB]].nTempPart = ( ( trTriaB.GetP( nSegMaxDist) - trTriaA.GetP( 0)) * trTriaA.GetN() < - EPS_SMALL ? 1 : - 1) ;
|
||||
@@ -1500,7 +1491,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
// Intersezione edge-edge
|
||||
else if ( bIntOnEndgeA && bIntOnEndgeB) {
|
||||
auto itA = AmbiguosA.find( nTA) ;
|
||||
if ( itA == AmbiguosA.end()) {
|
||||
if ( itA == AmbiguosA.end()) {
|
||||
TRIA3DVECTOR vVecTriaB ;
|
||||
vVecTriaB.emplace_back( trTriaB) ;
|
||||
AmbiguosA.emplace( nTA, vVecTriaB) ;
|
||||
@@ -1509,12 +1500,12 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
itA->second.emplace_back( trTriaB) ;
|
||||
}
|
||||
auto itB = AmbiguosB.find( vNearTria[nTB]) ;
|
||||
if ( itB == AmbiguosB.end()) {
|
||||
if ( itB == AmbiguosB.end()) {
|
||||
TRIA3DVECTOR vVecTriaA ;
|
||||
vVecTriaA.emplace_back( trTriaA) ;
|
||||
AmbiguosB.emplace( vNearTria[nTB], vVecTriaA) ;
|
||||
}
|
||||
else {
|
||||
else {
|
||||
itB->second.emplace_back( trTriaA) ;
|
||||
}
|
||||
}
|
||||
@@ -1526,7 +1517,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
}
|
||||
}
|
||||
|
||||
// Ritriangolarizzo i triangoli della superfici
|
||||
// Ritriangolarizzo i triangoli delle superfici
|
||||
RetriangulationForBooleanOperation( LineMapA, AmbiguosA, *this, bModif) ;
|
||||
RetriangulationForBooleanOperation( LineMapB, AmbiguosB, SurfB, bModif) ;
|
||||
|
||||
@@ -1544,12 +1535,10 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) {
|
||||
// Se il triangolo B non è valido, continuo
|
||||
Triangle3d trTriaB ;
|
||||
if ( ! ( SurfB.GetTriangle( nTB, trTriaB) && trTriaB.Validate( true)))
|
||||
if ( ! SurfB.GetTriangle( nTB, trTriaB) || ! trTriaB.Validate( true))
|
||||
continue ;
|
||||
DistPointTriangle DistCalculator( ptFirstV, trTriaB) ;
|
||||
double dDist ;
|
||||
DistCalculator.GetDist( dDist) ;
|
||||
if ( dDist < dMinDist) {
|
||||
if ( DistPointTriangle( ptFirstV, trTriaB).GetDist( dDist) && dDist < dMinDist) {
|
||||
nTriaNum = nTB ;
|
||||
dMinDist = dDist ;
|
||||
}
|
||||
@@ -1557,13 +1546,10 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
if ( nTriaNum >= 0) {
|
||||
Triangle3d trTriaB ;
|
||||
SurfB.GetTriangle( nTriaNum, trTriaB) ;
|
||||
|
||||
if ( ( ptFirstV - trTriaB.GetP(0)) * trTriaB.GetN() < - EPS_SMALL) {
|
||||
if ( ( ptFirstV - trTriaB.GetP(0)) * trTriaB.GetN() < - EPS_SMALL)
|
||||
nInOutNum = 1 ;
|
||||
}
|
||||
else if ( ( ptFirstV - trTriaB.GetP(0)) * trTriaB.GetN() > EPS_SMALL) {
|
||||
else if ( ( ptFirstV - trTriaB.GetP(0)) * trTriaB.GetN() > EPS_SMALL)
|
||||
nInOutNum = - 1 ;
|
||||
}
|
||||
}
|
||||
if ( nInOutNum == 0) {
|
||||
nCurVert = GetNextVertex( nVertNum, ptFirstV) ;
|
||||
@@ -1595,8 +1581,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
}
|
||||
if ( nTriaNum >= 0) {
|
||||
Triangle3d trTriaA ;
|
||||
GetTriangle( nTriaNum, trTriaA) ;
|
||||
|
||||
GetTriangle( nTriaNum, trTriaA) ;
|
||||
if ( ( ptFirstV - trTriaA.GetP( 0)) * trTriaA.GetN() < - EPS_SMALL) {
|
||||
nInOutNum = 1 ;
|
||||
}
|
||||
@@ -1617,8 +1602,8 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
// Se c'è stata una ritriangolazione di almeno un triangolo, NON siamo nel caso di tutto dentro o tutto fuori.
|
||||
// Studio i triangoli ambigui.
|
||||
if ( bRetriangulated) {
|
||||
AmbiguosTriangleHandler( AmbiguosA, *this) ;
|
||||
AmbiguosTriangleHandler( AmbiguosB, SurfB) ;
|
||||
AmbiguosTriangleManager( AmbiguosA, *this) ;
|
||||
AmbiguosTriangleManager( AmbiguosB, SurfB) ;
|
||||
}
|
||||
|
||||
bool bContinue = true ;
|
||||
@@ -1628,15 +1613,12 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
// Triangoli sovrapposti
|
||||
if ( bContinue) {
|
||||
int nTriaNumA = GetTriangleSize() ;
|
||||
// int nTriaNumB = SurfB.GetTriangleSize() ;
|
||||
|
||||
// Resetto e ricalcolo la HashGrid della superficie B
|
||||
SurfB.ResetHashGrids3d() ;
|
||||
SurfB.VerifyHashGrids3d() ;
|
||||
for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) {
|
||||
// Se il triangolo A non è valido, continuo
|
||||
Triangle3d trTriaA ;
|
||||
if ( ! ( GetTriangle( nTA, trTriaA) && trTriaA.Validate( true)))
|
||||
if ( ! GetTriangle( nTA, trTriaA) || ! trTriaA.Validate( true))
|
||||
continue ;
|
||||
// Box del triangolo A
|
||||
BBox3d b3dTriaA ;
|
||||
@@ -1648,13 +1630,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
|
||||
for ( int nTB = 0 ; nTB < int( vNearTria.size()) ; ++ nTB) {
|
||||
// Se il triangolo B non è valido, continuo
|
||||
Triangle3d trTriaB ;
|
||||
if ( ! ( SurfB.GetTriangle( vNearTria[nTB], trTriaB) && trTriaB.Validate( true)))
|
||||
continue ;
|
||||
// Box del triangolo B
|
||||
BBox3d b3dTriaB ;
|
||||
trTriaB.GetLocalBBox( b3dTriaB) ;
|
||||
// Se i box non si sovrappongono, contiuno
|
||||
if ( ! b3dTriaA.Overlaps( b3dTriaB))
|
||||
if ( ! SurfB.GetTriangle( vNearTria[nTB], trTriaB) || ! trTriaB.Validate( true))
|
||||
continue ;
|
||||
// Se i triangoli sono sovrapposti
|
||||
TRIA3DVECTOR vTriaAB ;
|
||||
|
||||
Reference in New Issue
Block a user