From 576459dd5f683a3b0fc5238346002e33236d04de Mon Sep 17 00:00:00 2001 From: LorenzoM Date: Fri, 14 May 2021 17:34:23 +0200 Subject: [PATCH] Fix loop infiniti --- SurfTriMeshBooleans.cpp | 57 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index d63bace..8e75849 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -3197,6 +3197,8 @@ bool SurfTriMesh::SplitFacet( const INTERSCHAINMAP& IntersLineMap, PieceMap& NewFacet) { for ( auto it = IntersLineMap.begin() ; it != IntersLineMap.end() ; ++ it) { + if (it->first == 5591) + int qqq = 0; // Normale alla faccia Vector3d vtFacetNorm ; GetFacetNormal( it->first, vtFacetNorm) ; @@ -3437,7 +3439,10 @@ SurfTriMesh::SplitFacet( const INTERSCHAINMAP& IntersLineMap, PieceMap& NewFacet else { INTVECTOR vChainIndex ; vChainIndex.emplace_back( nLastChainNum) ; - while ( vLoopIndexes.back() != vLoopIndexes[0]) { + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + int nIter = 0; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + while ( vLoopIndexes.back() != vLoopIndexes[0] && nIter == 0) { // Cambio inizio del loop corrente in modo che il punto di inizio sia il punto finale dell'ultima catena trovata. ChangePolyLineStart( cvOpenChain[vChainIndex.back()].back().ptEn, vNewPieces[nPart].vPieceLoop[vLoopIndexes.back()]) ; // Cerco catene che iniziano sul loop coorente @@ -3457,8 +3462,14 @@ SurfTriMesh::SplitFacet( const INTERSCHAINMAP& IntersLineMap, PieceMap& NewFacet return Ch1.dParOnSeg < Ch2.dParOnSeg ; else return false ; } ) ; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ++ nIter ; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Cerco la prima catena che non termina sul loop corrente. for ( int n = 0 ; n < int( vChainStartingOnLoop.size()) ; ++ n) { + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool bFound = false; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Indice della catena e indice del segmento finale int nCh = vChainStartingOnLoop[n].nIndexInVec ; int nLastLineIndex = int( cvOpenChain[nCh].size()) - 1 ; @@ -3474,13 +3485,19 @@ SurfTriMesh::SplitFacet( const INTERSCHAINMAP& IntersLineMap, PieceMap& NewFacet // La catena termina su questo loop diverso da quello corrente. if ( nLoop != vLoopIndexes.back() && PointPositionOnPolyLine( cvOpenChain[nCh][nLastLineIndex].ptEn, vNewPieces[nPart].vPieceLoop[nLoop], nSegNum, dParOnSeg)) { + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + nIter = 0 ; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Salvo l'indice della catena e quello del loop. vChainIndex.emplace_back( nCh) ; vLoopIndexes.emplace_back( nLoop) ; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bFound = true; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// break ; } } - if ( nLoop == nLoopNum) + if ( nLoop == nLoopNum/* 77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777 */ || bFound) break ; } } @@ -4594,6 +4611,10 @@ SurfTriMesh::ItersectTriMeshFacets( SurfTriMesh& Other) int nFacetNumA = GetFacetCount() ; int nFacetNumB = SurfB.GetFacetCount() ; for ( int nFA = 0 ; nFA < nFacetNumA ; ++ nFA) { + ///////////////////////////////////////////////////////// + if (nFA == 129) + int mimi = 0; + ///////////////////////////////////////////////////////// // Dati della faccia POLYLINEVECTOR LoopVecA ; GetFacetLoops( nFA, LoopVecA) ; @@ -4762,6 +4783,22 @@ SurfTriMesh::ItersectTriMeshFacets( SurfTriMesh& Other) } } + ///////////////////////////////////////////////////////////////////////////////// + for ( int nFB = 0 ; nFB < nFacetNumB ; ++ nFB) { + // Dati della faccia + POLYLINEVECTOR LoopVecB ; + SurfB.GetFacetLoops( nFB, LoopVecB) ; + PtrOwner pRegB( GetBasicSurfFlatRegion( GetSurfFlatRegionFromPolyLineVector( LoopVecB))) ; + if ( pRegB == nullptr) + return false ; + SurfFlatRegion RegionB = *pRegB ; + /*Plane3d plPlaneB ;*/ + /*plPlaneB.Set( RegionB.GetPlanePoint(), RegionB.GetNormVersor()) ;*/ + if (RegionB.GetNormVersor().x > 0.99) + int m = 0; + } + ///////////////////////////////////////////////////////////////////////////////// + // Divido le facce PieceMap NewFacetA, NewFacetB ; SplitFacet( IntersLineMapA, NewFacetA) ; @@ -4978,6 +5015,18 @@ SurfTriMesh::ItersectTriMeshFacets( SurfTriMesh& Other) frIntersRegion.Intersect( RegionB) ; double dIntersRegArea ; frIntersRegion.GetArea( dIntersRegArea) ; + /*bool bOverlap = dIntersRegArea > EPS_SMALL ; + double dRegionAreaA ; + RegionA.GetArea( dRegionAreaA) ; + double dRegionAreaB ; + RegionB.GetAera( dRegionAreaB) ; + if ( ( abs( dIntersRegArea - dRegionAreaA) < EPS_SMALL && dRegionAreaA < 0.75 * dRegionAreaB) || + ( abs( dIntersRegArea - dRegionAreaB) < EPS_SMALL && dRegionAreaB < 0.75 * dRegionAreaA)) { + if ( ) + bOverlap = ; + else + bOverlap = ; + }*/ // Assegno indice di parte al pezzo di faccia A e ai triangoli della faccia B. if ( dIntersRegArea > EPS_SMALL) { bool bCodirectedNorm = plPlaneA.GetVersN() * plPlaneB.GetVersN() > 0 ; @@ -5054,6 +5103,10 @@ SurfTriMesh::ItersectTriMeshFacets( SurfTriMesh& Other) if ( n == int( vFacetIndexesB.size())) vFacetIndexesB.emplace_back( nF) ; } + ///////////////////////////////////////////////////////// + if (nFA == 129) + int mimi = 0; + ///////////////////////////////////////////////////////// // Ciclo sulle facce di B for ( int& nFB : vFacetIndexesB) { auto itFacetB = NewFacetB.find( nFB) ;