diff --git a/SurfTriMesh.h b/SurfTriMesh.h index acb0852..1cdc31c 100644 --- a/SurfTriMesh.h +++ b/SurfTriMesh.h @@ -299,7 +299,7 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW bool VerifyConnection( void) const ; bool DecomposeLoop( CHAINVECTOR& cvOpenChain, INTVECTOR& vnDegVec, PNTMATRIX& cvBoundClosedLoopVec, BOOLVECTOR& vbInOut) ; bool RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECTORMAP& Ambiguos, SurfTriMesh& Surf, bool& bModif) ; - bool AmbiguosTriangleHandler( TRIA3DVECTORMAP& Ambiguos, SurfTriMesh& Surf) ; + bool AmbiguosTriangleManager( TRIA3DVECTORMAP& Ambiguos, SurfTriMesh& Surf) ; bool IntersectTriMeshTriangle( SurfTriMesh& Other) ; bool IdentifyParts( void) const ; bool RemoveTJunction( void) ; diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index 6b85905..8d57639 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -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 ;