EgtGeomKernel 2.5d4 :

- in ApproxWithLines di CurveComposite aggiunta gestione tipo approssimazione APL_SPECIAL_INT (come SPECIAL ma con garanzia di tre punti su curve non rettilinee)
- migliorato calcolo AreaXY e Area di Curve grazie al nuovo tipo di approssimazione
- migliorata in Dump gestione decimali di Area
- in OffsetCurve corretto possibile errore con curve chiuse dovuto a mancata unione tratti tra autointersezioni suddiviso tra inizio e fine curva.
This commit is contained in:
DarioS
2023-04-24 15:47:41 +02:00
parent 13b02f51a3
commit 469e660da0
4 changed files with 51 additions and 11 deletions
+30 -4
View File
@@ -422,6 +422,10 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
m_CrvLst.push_back( Release( pCrvCompo)) ;
CurveComposite* pCompo1 = GetBasicCurveComposite( m_CrvLst.front()) ;
// salvo punto iniziale
Point3d ptStart ;
pCompo1->GetStartPoint( ptStart) ;
// quinto passo : spezzatura della curva composita negli eventuali punti di auto-intersezione
// calcolo le auto-intersezioni
SelfIntersCurve sintC( *pCompo1) ;
@@ -454,7 +458,6 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
vLen.pop_back() ;
}
// eseguo la divisione
int nCount = 1 ;
double dUPrev = 0 ;
double dLenPrev = 0 ;
for ( int i = 0 ; i < int( vU.size()) ; ++ i) {
@@ -466,7 +469,6 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
if ( IsNull( pCopy))
return false ;
m_CrvLst.push_back( Release( pCopy)) ;
++ nCount ;
// trimmo l'originale
pCompo1->TrimStartEndAtParam( dUPrev, vU[i]) ;
// la copia diventa il nuovo corrente
@@ -474,9 +476,20 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
dUPrev = vU[i] ;
dLenPrev = vLen[i] ;
}
// se fatta almeno una suddivisione, trimmo l'ultima parte
if ( dUPrev > EPS_PARAM)
// se fatta almeno una suddivisione
if ( dUPrev > EPS_PARAM) {
// trimmo l'ultima parte
pCompo1->TrimStartAtParam( dUPrev) ;
// sistemo le curve chiuse con due parti di una stessa curva all'inizio e alla fine
if ( bClosed) {
if ( vU[0] > EPS_PARAM && vLen[0] >= 2 * EPS_SMALL) {
// accodo il finale al'iniziale
pCompo1 = GetBasicCurveComposite( m_CrvLst.front()) ;
pCompo1->AddCurve( m_CrvLst.back(), false, 10 * EPS_SMALL) ;
m_CrvLst.pop_back() ;
}
}
}
// sesto passo : se curva aperta, elimino i tratti che stanno nella circonferenza di offset dei punti estremi
if ( ! bClosed) {
@@ -631,6 +644,19 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
}
++ iIter ;
}
// se chiusa riporto l'inizio del primo loop alla posizione iniziale
if ( bClosed) {
for ( auto iIter = m_CrvLst.begin() ; iIter != m_CrvLst.end() ; ++ iIter) {
CurveComposite* pCrvCo = GetBasicCurveComposite( *iIter) ;
DistPointCurve dstPC( ptStart, *pCrvCo) ;
if ( dstPC.IsEpsilon( 10 * EPS_SMALL)) {
double dU ; int nFlag ;
dstPC.GetParamAtMinDistPoint( 0, dU, nFlag) ;
pCrvCo->ChangeStartPoint( round( dU)) ;
break ;
}
}
}
// nono passo : se con smusso o estensione, sostituisco i fillet con questi
if ( ( nType & ICurve::OFF_CHAMFER) != 0 || ( nType & ICurve::OFF_EXTEND) != 0) {