From 5bd5efafb191c75afe233c33a5fa9ac4cce15116 Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 23 Nov 2023 13:04:05 +0100 Subject: [PATCH] EgtGeomKernel : - miglioria in AdjustLoops per gestire piccole autointersezioni - piccola correzione in RemoveCurveSmallParts. --- AdjustLoops.cpp | 35 ++++++++++++++++++++++++++++++----- RemoveCurveDefects.cpp | 8 ++++---- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/AdjustLoops.cpp b/AdjustLoops.cpp index af1df8c..9b37a4d 100644 --- a/AdjustLoops.cpp +++ b/AdjustLoops.cpp @@ -149,11 +149,36 @@ MyAdjustLoops( ICurve* pCurve, ICURVEPLIST& CrvLst) } // altrimenti attraversamento else { - if ( IsEven( nCross)) - inOk.Subtract( vIccInfo[i].IciA[0].dU, vIccInfo[i].IciB[0].dU) ; - else - inOk.Add( vIccInfo[i].IciA[0].dU, vIccInfo[i].IciB[0].dU) ; - ++ nCross ; + double dParA = vIccInfo[i].IciA[0].dU ; + double dParB = vIccInfo[i].IciB[0].dU ; + if ( abs( dParA - dEnd) < EPS_SMALL) + swap( dParA, dParB) ; + // verifico se uno dei due intervalli dà origine ad un tratto trascurabile + PtrOwner pCrv1( pMyCrv->CopyParamRange( dParA, dParB)) ; + PtrOwner pCrv2( pMyCrv->CopyParamRange( dParB, dParA)) ; + double dArea1 = 0, dArea2 = 0 ; + if ( ! IsNull( pCrv1)) + pCrv1->GetAreaXY( dArea1) ; + if ( ! IsNull( pCrv2)) + pCrv2->GetAreaXY( dArea2) ; + + if ( abs( dArea1) > 1e6 * abs( dArea2)) { + // se il tratto dParB->dParA non è significativo + inOk.Subtract( dStart, dParA) ; + inOk.Subtract( dParB, dEnd) ; + } + else if ( abs( dArea2) > 1e6 * abs( dArea1)) { + // se il tratto dParA->dParB non è siginificativo + inOk.Subtract( dParA, dParB) ; + } + else { + // se entrambe le regioni sono significative + if ( IsEven( nCross)) + inOk.Subtract( vIccInfo[i].IciA[0].dU, vIccInfo[i].IciB[0].dU) ; + else + inOk.Add( vIccInfo[i].IciA[0].dU, vIccInfo[i].IciB[0].dU) ; + ++ nCross ; + } } } } diff --git a/RemoveCurveDefects.cpp b/RemoveCurveDefects.cpp index 1a14bef..f3b0a42 100644 --- a/RemoveCurveDefects.cpp +++ b/RemoveCurveDefects.cpp @@ -158,6 +158,7 @@ RemoveCurveSmallParts( ICurveComposite* pCurve, double dLinTol) Point3d ptStart ; pFirstCrv->GetStartPoint( ptStart) ; delete( pCurve->RemoveFirstOrLastCurve( false)) ; pCurve->ModifyStart( ptStart) ; + -- nCrvCount ; } // curva finale const ICurve* pLastCrv = pCurve->GetLastCurve() ; @@ -166,16 +167,15 @@ RemoveCurveSmallParts( ICurveComposite* pCurve, double dLinTol) Point3d ptEnd ; pLastCrv->GetStartPoint( ptEnd) ; delete( pCurve->RemoveFirstOrLastCurve( true)) ; pCurve->ModifyEnd( ptEnd) ; + -- nCrvCount ; } - } + } // ciclo sulle curve elementari della composita int nStart = pCurve->IsClosed() ? 0 : 1 ; int nEnd = pCurve->IsClosed() ? nCrvCount : nCrvCount - 1 ; for ( int i = nStart ; i < nEnd ; ++ i) { - // recupero tre curve consecutive - const ICurve* pPrevCrv = pCurve->GetCurve( ( i > 0 ? i - 1 : nCrvCount - 1)) ; + // recupero la curva corrente const ICurve* pCurrCrv = pCurve->GetCurve( i) ; - const ICurve* pNextCrv = pCurve->GetCurve( ( i < nCrvCount - 1 ? i + 1 : 0)) ; // se la curva corrente è troppo corta double dLen ; pCurrCrv->GetLength( dLen) ; if ( dLen < dLinTol) {