EgtGeomKernel 1.9l3 :

- modifiche a ApproxWithArcsEx di CurveComposite per eliminare le parti allineate in tolleranza
- migliorate RemoveAlignedPoints di PolyLine e PolyArc
- migliorata GetSurfFlatRegionFromFatCurve.
This commit is contained in:
Dario Sassi
2018-12-19 08:45:59 +00:00
parent 92e3cc70a4
commit a149384fbb
6 changed files with 126 additions and 17 deletions
+21 -10
View File
@@ -672,6 +672,18 @@ PolyLine::AdjustForMaxSegmentLen( double dMaxLen)
return true ;
}
//----------------------------------------------------------------------------
static bool
PointsInTolerance( const PNTVECTOR& vRPT, const Point3d& ptP1, const Point3d& ptP2, double dSqTol)
{
for ( const auto& ptQ : vRPT) {
double dSqDist ;
if ( ! DistPointLine( ptQ, ptP1, ptP2).GetSqDist( dSqDist) || dSqDist > dSqTol)
return false ;
}
return true ;
}
//----------------------------------------------------------------------------
bool
PolyLine::RemoveAlignedPoints( double dToler)
@@ -681,8 +693,7 @@ PolyLine::RemoveAlignedPoints( double dToler)
return true ;
// controllo minimo valore di tolleranza
dToler = max( dToler, LIN_TOL_MIN) ;
// coefficiente deduzione tolleranza
const double COEFF_TOL = 0.90 ;
double dSqTol = dToler * dToler ;
// si analizza la distanza di un punto dal segmento che unisce precedente e successivo
// punto precedente
auto precP = m_lUPoints.begin() ;
@@ -690,17 +701,17 @@ PolyLine::RemoveAlignedPoints( double dToler)
auto currP = next( precP) ;
// punto successivo
auto nextP = next( currP) ;
// assegno la tolleranza corrente
double dCurrToler = dToler ;
// lista dei punti appena rimossi
PNTVECTOR vRPT ; vRPT.reserve( 20) ;
// mentre esiste un successivo
while ( nextP != m_lUPoints.end()) {
// distanza del punto corrente dal segmento che unisce gli adiacenti
DistPointLine dPL( currP->first, precP->first, nextP->first) ;
double dSqDist ;
// se da eliminare
if ( dPL.GetSqDist( dSqDist) && dSqDist < dCurrToler * dCurrToler) {
// diminuisco la tolleranza corrente dell'errore attuale
dCurrToler -= COEFF_TOL * sqrt( dSqDist) ;
if ( dPL.GetSqDist( dSqDist) && dSqDist < dSqTol && PointsInTolerance( vRPT, precP->first, nextP->first, dSqTol)) {
// aggiungo il punto nella lista dei rimossi
vRPT.emplace_back( currP->first) ;
// elimino il punto
m_lUPoints.erase( currP) ;
// avanzo con corrente e successivo
@@ -709,8 +720,8 @@ PolyLine::RemoveAlignedPoints( double dToler)
}
// altrimenti da tenere
else {
// ripristino la tolleranza corrente
dCurrToler = dToler ;
// cancello la lista dei rimossi
vRPT.clear() ;
// avanzo il terzetto di uno step
precP = currP ;
currP = nextP ;
@@ -728,7 +739,7 @@ PolyLine::RemoveAlignedPoints( double dToler)
DistPointLine dPL( currP->first, precP->first, nextP->first) ;
double dSqDist ;
// se da eliminare
if ( dPL.GetSqDist( dSqDist) && dSqDist < dCurrToler * dCurrToler) {
if ( dPL.GetSqDist( dSqDist) && dSqDist < dSqTol && PointsInTolerance( vRPT, precP->first, nextP->first, dSqTol)) {
// faccio coincidere il primo punto con il precedente
firstP->first = precP->first ;
// elimino il punto corrente