From 1c2b127a91de11ce4d9238100c127fd1df81d34a Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 8 Jan 2024 10:17:15 +0100 Subject: [PATCH] EgtGeomKernel : - migliorie in RemoveCurveSmallParts per evitare conti superflui introdotti con ultima correzione. --- RemoveCurveDefects.cpp | 53 +++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/RemoveCurveDefects.cpp b/RemoveCurveDefects.cpp index 48d81f5..fbc0a55 100644 --- a/RemoveCurveDefects.cpp +++ b/RemoveCurveDefects.cpp @@ -149,6 +149,7 @@ RemoveCurveSmallParts( ICurveComposite* pCurve, double dLinTol) int nCrvCount = pCurve->GetCurveCount() ; if ( nCrvCount < 2 || ( nCrvCount < 3 && pCurve->IsClosed())) return true ; + // se aperta, verifico le due curve agli estremi if ( ! pCurve->IsClosed()) { // curva iniziale @@ -158,6 +159,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,40 +168,33 @@ RemoveCurveSmallParts( ICurveComposite* pCurve, double dLinTol) Point3d ptEnd ; pLastCrv->GetStartPoint( ptEnd) ; delete( pCurve->RemoveFirstOrLastCurve( true)) ; pCurve->ModifyEnd( ptEnd) ; + -- nCrvCount ; } } - // ciclo sulle curve elementari della composita finchè trovo tratti da eliminare - bool bRemoved = false ; - do { - int nStart = pCurve->IsClosed() ? 0 : 1 ; - int nEnd = pCurve->GetCurveCount() - ( pCurve->IsClosed() ? 0 : 1) ; - bRemoved = false ; - for ( int i = nStart ; i < nEnd ; ++ i) { - // recupero la curva corrente - const ICurve* pCurrCrv = pCurve->GetCurve( i) ; - // se la curva corrente è troppo corta - double dLen ; pCurrCrv->GetLength( dLen) ; - if ( dLen < dLinTol) { - // recupero il punto medio della curva - Point3d ptMid ; pCurrCrv->GetMidPoint( ptMid) ; - // rimuovo il segmento - if ( pCurve->RemoveJoint( i)) { - bRemoved = true ; - // porto il nuovo estremo sul punto medio - pCurve->ModifyJoint( i, ptMid) ; - break ; - } - // altrimenti devo rimuovere anche il successivo - else if ( pCurve->RemoveJoint( i + 1) && pCurve->RemoveJoint( i)) { - bRemoved = true ; - // porto il nuovo estremo sul punto medio - pCurve->ModifyJoint( i, ptMid) ; - break ; - } + + // 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 la curva corrente + const ICurve* pCurrCrv = pCurve->GetCurve( i) ; + // se la curva corrente è troppo corta + double dLen ; pCurrCrv->GetLength( dLen) ; + if ( dLen < dLinTol) { + // recupero il punto medio della curva + Point3d ptMid ; pCurrCrv->GetMidPoint( ptMid) ; + // rimuovo il segmento oppure in caso di fallimento rimuovo anche il successivo + if ( pCurve->RemoveJoint( i) || ( pCurve->RemoveJoint( i + 1) && pCurve->RemoveJoint( i))) { + // porto il nuovo estremo sul punto medio + pCurve->ModifyJoint( i, ptMid) ; + // aggiorno valore di i tenendo conto che ModifyJoint potrebbe modificare la curva precedente + // che quindi va ricontrollata + i = max( i - 2, nStart - 1) ; + // aggiorno valore di nEnd ( ModifyJoint potrebbe aver rimosso la curva precedente e la successiva) + nEnd = pCurve->GetCurveCount() - ( pCurve->IsClosed() ? 0 : 1) ; } } } - while ( bRemoved) ; return true ; } \ No newline at end of file