Fix loop infiniti
This commit is contained in:
+55
-2
@@ -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) ;
|
||||
|
||||
Reference in New Issue
Block a user