EgtGeomKernel :

- migliorie in RemoveCurveSmallParts per evitare conti superflui introdotti con ultima correzione.
This commit is contained in:
SaraP
2024-01-08 10:17:15 +01:00
parent 0e927d7294
commit 1c2b127a91
+24 -29
View File
@@ -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 ;
}