Fix loop infiniti

This commit is contained in:
LorenzoM
2021-05-14 17:34:23 +02:00
parent f13661c0bd
commit 576459dd5f
+55 -2
View File
@@ -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<SurfFlatRegion> 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) ;