EgtGeomKernel 2.5d5 :

- semplificata la precedente correzione all'offset avanzato delle curve.
This commit is contained in:
DarioS
2023-04-25 17:40:18 +02:00
parent 469e660da0
commit 545e37b7cd
2 changed files with 21 additions and 26 deletions
BIN
View File
Binary file not shown.
+21 -26
View File
@@ -422,10 +422,6 @@ 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) ;
@@ -477,18 +473,13 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
dLenPrev = vLen[i] ;
}
// se fatta almeno una suddivisione
bool bFirstLastSame = false ;
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() ;
}
}
// rilevo le curve chiuse con due parti di una stessa curva all'inizio e alla fine
if ( bClosed && vU[0] > EPS_PARAM && vLen[0] >= 2 * EPS_SMALL)
bFirstLastSame = true ;
}
// sesto passo : se curva aperta, elimino i tratti che stanno nella circonferenza di offset dei punti estremi
@@ -594,6 +585,7 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
}
// settimo passo : elimino le parti che sono troppo vicine al percorso originale
bool bFirstLastDeleted = false ;
for ( auto iIter = m_CrvLst.begin() ; iIter != m_CrvLst.end() ;) {
ICurve* pCrv = *iIter ;
// distanza minima di alcuni punti interni della curva dalla curva originale
@@ -604,8 +596,24 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
GetMinDist( 0.875, pCrv, &ccCopy) < abs( dDist) - 5 * EPS_SMALL ||
GetMinDist( 0.0625, pCrv, &ccCopy) < abs( dDist) - 5 * EPS_SMALL ||
GetMinDist( 0.9375, pCrv, &ccCopy) < abs( dDist) - 5 * EPS_SMALL) {
// se prima e ultima sono la stessa curva e non ancora cancellate e prima da cancellare
if ( bFirstLastSame && ! bFirstLastDeleted && iIter == m_CrvLst.begin()) {
bFirstLastDeleted = true ;
// cancello ultima
delete *prev( m_CrvLst.end()) ;
m_CrvLst.pop_back() ;
}
// se prima e ultima sono la stessa curva e non ancora cancellate e ultima da cancellare
if ( bFirstLastSame && ! bFirstLastDeleted && iIter == prev( m_CrvLst.end())) {
bFirstLastDeleted = true ;
// cancello prima
delete *m_CrvLst.begin() ;
m_CrvLst.pop_front() ;
}
// cancello la corrente
delete pCrv ;
iIter = m_CrvLst.erase( iIter) ;
// evito incremento
continue ;
}
// passo alla successiva
@@ -644,19 +652,6 @@ 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) {