EgtGeomKernel 2.5k1 :

- aggiunta funzione RemoveCurveSmallParts per eliminare curve semplici molto corte da composite modificando le adiacenti
- aggiunto filtro con funzione precedente in ricostruzione contorni di regioni dopo operazioni booleane
- aggiunto filtro con funzione precedente prima di offset avanzato
- in CurveBezier calcoli resi indipendenti da lunghezza almeno EPS_SMALL.
This commit is contained in:
Dario Sassi
2023-11-03 17:22:53 +01:00
parent 2d5657a05a
commit badbef94e6
8 changed files with 98 additions and 9 deletions
+67
View File
@@ -135,3 +135,70 @@ RemoveCurveSmallZs( ICurveComposite* pCurve, double dLinTol)
return true ;
}
//----------------------------------------------------------------------------
bool
RemoveCurveSmallParts( ICurveComposite* pCurve, double dLinTol)
{
// verifico validità curva
if ( pCurve == nullptr)
return false ;
// verifico e sistemo tolleranza lineare
dLinTol = max( dLinTol, EPS_SMALL) ;
// recupero il numero di curve semplici componenti la composta
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
const ICurve* pFirstCrv = pCurve->GetFirstCurve() ;
double dFirstLen ; pFirstCrv->GetLength( dFirstLen) ;
if ( dFirstLen < dLinTol) {
Point3d ptStart ; pFirstCrv->GetStartPoint( ptStart) ;
delete( pCurve->RemoveFirstOrLastCurve( false)) ;
pCurve->ModifyStart( ptStart) ;
}
// curva finale
const ICurve* pLastCrv = pCurve->GetLastCurve() ;
double dLastLen ; pLastCrv->GetLength( dLastLen) ;
if ( dLastLen < dLinTol) {
Point3d ptEnd ; pLastCrv->GetStartPoint( ptEnd) ;
delete( pCurve->RemoveFirstOrLastCurve( true)) ;
pCurve->ModifyEnd( ptEnd) ;
}
}
// 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)) ;
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) {
// recupero il punto medio della curva
Point3d ptMid ; pCurrCrv->GetMidPoint( ptMid) ;
// rimuovo il segmento
if ( pCurve->RemoveJoint( i)) {
-- nCrvCount ;
-- nEnd ;
-- i ;
// porto il nuovo estremo sul punto medio
pCurve->ModifyJoint( i + 1, ptMid) ;
}
// altrimenti devo rimuovere anche il successivo
else if ( pCurve->RemoveJoint( i + 1) && pCurve->RemoveJoint( i)) {
nCrvCount -= 2 ;
nEnd -= 2 ;
-- i ;
// porto il nuovo estremo sul punto medio
pCurve->ModifyJoint( i + 1, ptMid) ;
}
}
}
return true ;
}