diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index a646862..ca7b68e 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -4532,41 +4532,47 @@ SurfTriMesh::ItersectTriMeshFacets( SurfTriMesh& Other) Point3d ptL ; Vector3d vtL ; int nResPP = IntersPlanePlane( plPlaneA, plPlaneB, ptL, vtL) ; if ( /*nResPP == IPPT_NO ||*/ nResPP == IPPT_OVERLAPS) { + // Se necessario inverto la regione B per eseguire l'intersezione. + if ( plPlaneA.GetVersN() * plPlaneB.GetVersN() < - EPS_SMALL) + RegionB.Invert() ; SurfFlatRegion frIntersRegion = RegionA ; frIntersRegion.Intersect( RegionB) ; double dIntersRegArea ; frIntersRegion.GetArea( dIntersRegArea) ; // Assegno indice di parte ai pezzi. if ( dIntersRegArea > EPS_SMALL) { - bool bCodirectedNorm = RegionA.GetNormVersor() * RegionB.GetNormVersor() > 0; + bool bCodirectedNorm = RegionA.GetNormVersor() * RegionB.GetNormVersor() > 0 ; int nPartIndex = bCodirectedNorm ? 2 : - 2 ; - itFacetA->second[nPieceNumA].nPiecePart = nPartIndex; - itFacetB->second[nPieceNumB].nPiecePart = nPartIndex; + itFacetA->second[nPieceNumA].nPiecePart = nPartIndex ; + itFacetB->second[nPieceNumB].nPiecePart = nPartIndex ; } } - else if (nResPP == IPPT_YES) { + else if ( nResPP == IPPT_YES) { Point3d ptCentroidA, ptCentroidB ; RegionA.GetCentroid( ptCentroidA) ; RegionB.GetCentroid( ptCentroidB) ; if ( AreSameOrOppositeVectorApprox( plPlaneA.GetVersN(), plPlaneB.GetVersN()) && abs( ( ptCentroidB - ptCentroidA) * plPlaneA.GetVersN()) < EPS_SMALL) { - BBox3d b3Box, b3BoxB; - RegionA.GetLocalBBox(b3Box); - RegionB.GetLocalBBox(b3BoxB); - b3Box.Add(b3BoxB); - b3Box.Expand(10); - INTDBLVECTOR vInters; - if (!IntersLineBox(ptL, vtL, 100., b3Box, vInters, false) || int(vInters.size()) < 2) { - SurfFlatRegion frIntersRegion = RegionA; - frIntersRegion.Intersect(RegionB); - double dIntersRegArea; - frIntersRegion.GetArea(dIntersRegArea); + BBox3d b3Box, b3BoxB ; + RegionA.GetLocalBBox( b3Box) ; + RegionB.GetLocalBBox( b3BoxB) ; + b3Box.Add( b3BoxB) ; + b3Box.Expand( 10) ; + INTDBLVECTOR vInters ; + if ( ! IntersLineBox( ptL, vtL, 100., b3Box, vInters, false) || int( vInters.size()) < 2) { + // Se necessario inverto la regione B per eseguire l'intersezione. + if ( plPlaneA.GetVersN() * plPlaneB.GetVersN() < - EPS_SMALL) + RegionB.Invert() ; + SurfFlatRegion frIntersRegion = RegionA ; + frIntersRegion.Intersect( RegionB) ; + double dIntersRegArea ; + frIntersRegion.GetArea( dIntersRegArea) ; // Assegno indice di parte ai pezzi. - if (dIntersRegArea > EPS_SMALL) { - bool bCodirectedNorm = RegionA.GetNormVersor() * RegionB.GetNormVersor() > 0; - int nPartIndex = bCodirectedNorm ? 2 : -2; - itFacetA->second[nPieceNumA].nPiecePart = nPartIndex; - itFacetB->second[nPieceNumB].nPiecePart = nPartIndex; + if ( dIntersRegArea > EPS_SMALL) { + bool bCodirectedNorm = RegionA.GetNormVersor() * RegionB.GetNormVersor() > 0 ; + int nPartIndex = bCodirectedNorm ? 2 : - 2 ; + itFacetA->second[nPieceNumA].nPiecePart = nPartIndex ; + itFacetB->second[nPieceNumB].nPiecePart = nPartIndex ; } } } @@ -4588,6 +4594,9 @@ SurfTriMesh::ItersectTriMeshFacets( SurfTriMesh& Other) Point3d ptL ; Vector3d vtL ; int nResPP = IntersPlanePlane( plPlaneA, plPlaneB, ptL, vtL) ; if ( /*nResPP == IPPT_NO ||*/ nResPP == IPPT_OVERLAPS) { + // Se necessario inverto la regione B per eseguire l'intersezione. + if ( plPlaneA.GetVersN() * plPlaneB.GetVersN() < - EPS_SMALL) + RegionB.Invert() ; SurfFlatRegion frIntersRegion = RegionA ; frIntersRegion.Intersect( RegionB) ; double dIntersRegArea ; @@ -4608,27 +4617,30 @@ SurfTriMesh::ItersectTriMeshFacets( SurfTriMesh& Other) RegionA.GetCentroid( ptCentroidA) ; RegionB.GetCentroid( ptCentroidB) ; if ( AreSameOrOppositeVectorApprox(plPlaneA.GetVersN(), plPlaneB.GetVersN()) && - abs((ptCentroidB - ptCentroidA) * plPlaneA.GetVersN()) < EPS_SMALL) { - BBox3d b3Box, b3BoxB; - RegionA.GetLocalBBox(b3Box); - RegionB.GetLocalBBox(b3BoxB); - b3Box.Add(b3BoxB); - b3Box.Expand(10); - INTDBLVECTOR vInters; - if (!IntersLineBox(ptL, vtL, 100., b3Box, vInters, false) || int(vInters.size()) < 2) { - SurfFlatRegion frIntersRegion = RegionA; - frIntersRegion.Intersect(RegionB); - double dIntersRegArea; - frIntersRegion.GetArea(dIntersRegArea); + abs( ( ptCentroidB - ptCentroidA) * plPlaneA.GetVersN()) < EPS_SMALL) { + BBox3d b3Box, b3BoxB ; + RegionA.GetLocalBBox( b3Box) ; + RegionB.GetLocalBBox( b3BoxB) ; + b3Box.Add( b3BoxB) ; + b3Box.Expand( 10) ; + INTDBLVECTOR vInters ; + if ( ! IntersLineBox( ptL, vtL, 100., b3Box, vInters, false) || int( vInters.size()) < 2) { + // Se necessario inverto la regione B per eseguire l'intersezione. + if ( plPlaneA.GetVersN() * plPlaneB.GetVersN() < - EPS_SMALL) + RegionB.Invert() ; + SurfFlatRegion frIntersRegion = RegionA ; + frIntersRegion.Intersect( RegionB) ; + double dIntersRegArea ; + frIntersRegion.GetArea( dIntersRegArea) ; // Assegno indice di parte al pezzo di faccia A e ai triangoli della faccia B. - if (dIntersRegArea > EPS_SMALL) { - bool bCodirectedNorm = RegionA.GetNormVersor() * RegionB.GetNormVersor() > 0; - int nPartIndex = bCodirectedNorm ? 2 : -2; - itFacetA->second[nPieceNumA].nPiecePart = nPartIndex; - INTVECTOR vTB; - SurfB.GetAllTriaInFacet(nFB, vTB); - for (int& nTB : vTB) - SurfB.m_vTria[nTB].nTempPart = nPartIndex; + if ( dIntersRegArea > EPS_SMALL) { + bool bCodirectedNorm = RegionA.GetNormVersor() * RegionB.GetNormVersor() > 0 ; + int nPartIndex = bCodirectedNorm ? 2 : - 2 ; + itFacetA->second[nPieceNumA].nPiecePart = nPartIndex ; + INTVECTOR vTB ; + SurfB.GetAllTriaInFacet( nFB, vTB) ; + for ( int& nTB : vTB) + SurfB.m_vTria[nTB].nTempPart = nPartIndex ; } } } @@ -4686,6 +4698,9 @@ SurfTriMesh::ItersectTriMeshFacets( SurfTriMesh& Other) Point3d ptL ; Vector3d vtL ; int nResPP = IntersPlanePlane( plPlaneA, plPlaneB, ptL, vtL) ; if ( /*nResPP == IPPT_NO ||*/ nResPP == IPPT_OVERLAPS) { + // Se necessario inverto la regione B per eseguire l'intersezione. + if ( plPlaneA.GetVersN() * plPlaneB.GetVersN() < - EPS_SMALL) + RegionB.Invert() ; SurfFlatRegion frIntersRegion = RegionA ; frIntersRegion.Intersect( RegionB) ; double dIntersRegArea ; @@ -4714,6 +4729,9 @@ SurfTriMesh::ItersectTriMeshFacets( SurfTriMesh& Other) b3Box.Expand( 10) ; INTDBLVECTOR vInters; if ( ! IntersLineBox( ptL, vtL, 100., b3Box, vInters, false) || int( vInters.size()) < 2) { + // Se necessario inverto la regione B per eseguire l'intersezione. + if ( plPlaneA.GetVersN() * plPlaneB.GetVersN() < - EPS_SMALL) + RegionB.Invert() ; SurfFlatRegion frIntersRegion = RegionA ; frIntersRegion.Intersect( RegionB) ; double dIntersRegArea ; @@ -4748,6 +4766,9 @@ SurfTriMesh::ItersectTriMeshFacets( SurfTriMesh& Other) Point3d ptL ; Vector3d vtL ; int nResPP = IntersPlanePlane( plPlaneA, plPlaneB, ptL, vtL) ; if ( /*nResPP == IPPT_NO ||*/ nResPP == IPPT_OVERLAPS) { + // Se necessario inverto la regione B per eseguire l'intersezione. + if ( plPlaneA.GetVersN() * plPlaneB.GetVersN() < - EPS_SMALL) + RegionB.Invert() ; SurfFlatRegion frIntersRegion = RegionA ; frIntersRegion.Intersect( RegionB) ; double dIntersRegArea ; @@ -4766,35 +4787,38 @@ SurfTriMesh::ItersectTriMeshFacets( SurfTriMesh& Other) SurfB.m_vTria[nTB].nTempPart = nPartIndex ; } } - else if (nResPP == IPPT_YES) { + else if ( nResPP == IPPT_YES) { Point3d ptCentroidA, ptCentroidB ; RegionA.GetCentroid( ptCentroidA) ; RegionB.GetCentroid( ptCentroidB) ; if ( AreSameOrOppositeVectorApprox( plPlaneA.GetVersN(), plPlaneB.GetVersN()) && - abs( ( ptCentroidB - ptCentroidA) * plPlaneA.GetVersN()) < EPS_SMALL) { - BBox3d b3Box, b3BoxB; - RegionA.GetLocalBBox(b3Box); - RegionB.GetLocalBBox(b3BoxB); - b3Box.Add(b3BoxB); - b3Box.Expand(10); - INTDBLVECTOR vInters; - if (!IntersLineBox(ptL, vtL, 100., b3Box, vInters, false) || int(vInters.size()) < 2) { - SurfFlatRegion frIntersRegion = RegionA; - frIntersRegion.Intersect(RegionB); - double dIntersRegArea; - frIntersRegion.GetArea(dIntersRegArea); + abs( ( ptCentroidB - ptCentroidA) * plPlaneA.GetVersN()) < EPS_SMALL) { + BBox3d b3Box, b3BoxB ; + RegionA.GetLocalBBox( b3Box) ; + RegionB.GetLocalBBox( b3BoxB) ; + b3Box.Add( b3BoxB) ; + b3Box.Expand( 10) ; + INTDBLVECTOR vInters ; + if ( ! IntersLineBox( ptL, vtL, 100., b3Box, vInters, false) || int( vInters.size()) < 2) { + // Se necessario inverto la regione B per eseguire l'intersezione. + if ( plPlaneA.GetVersN() * plPlaneB.GetVersN() < - EPS_SMALL) + RegionB.Invert() ; + SurfFlatRegion frIntersRegion = RegionA ; + frIntersRegion.Intersect( RegionB) ; + double dIntersRegArea ; + frIntersRegion.GetArea( dIntersRegArea) ; // Assegno indice di parte al pezzo di faccia A e ai triangoli della faccia B. - if (dIntersRegArea > EPS_SMALL) { - bool bCodirectedNorm = RegionA.GetNormVersor() * RegionB.GetNormVersor() > 0; - int nPartIndex = bCodirectedNorm ? 2 : -2; - INTVECTOR vTA; - GetAllTriaInFacet(nFA, vTA); - for (int& nTA : vTA) - m_vTria[nTA].nTempPart = nPartIndex; - INTVECTOR vTB; - SurfB.GetAllTriaInFacet(nFB, vTB); - for (int& nTB : vTB) - SurfB.m_vTria[nTB].nTempPart = nPartIndex; + if ( dIntersRegArea > EPS_SMALL) { + bool bCodirectedNorm = RegionA.GetNormVersor() * RegionB.GetNormVersor() > 0 ; + int nPartIndex = bCodirectedNorm ? 2 : - 2 ; + INTVECTOR vTA ; + GetAllTriaInFacet( nFA, vTA) ; + for ( int& nTA : vTA) + m_vTria[nTA].nTempPart = nPartIndex ; + INTVECTOR vTB ; + SurfB.GetAllTriaInFacet( nFB, vTB) ; + for ( int& nTB : vTB) + SurfB.m_vTria[nTB].nTempPart = nPartIndex ; } } }