EgtGeomKernel 1.5h5 :

- sistemata approssimazione di curve di Bezier con archi
- aggiunta a CurveBezier metodo per sapere se è collassata in un punto
- in PolyArc e PolyLine sostituite Splice con Join e aggiunte Split
- in TSC non si accetta più la creazione di una curva di Bezier collassata in un punto.
This commit is contained in:
Dario Sassi
2014-08-19 20:19:17 +00:00
parent de246fc3e7
commit d0521e8f92
23 changed files with 499 additions and 208 deletions
+39 -1
View File
@@ -207,8 +207,20 @@ PolyLine::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
//----------------------------------------------------------------------------
bool
PolyLine::Splice( PolyLine& PL)
PolyLine::Join( PolyLine& PL, double dOffsetPar)
{
// se l'altra polilinea non contiene alcunchè, esco con ok
if ( PL.m_nCount == 0)
return true ;
// verifico che l'ultimo punto di questa polilinea coincida con il primo dell'altra
if ( m_nCount > 0 && ! AreSamePointApprox( m_lUPoints.back().second, PL.m_lUPoints.front().second))
return false ;
// cancello l'ultimo di questa
EraseLastUPoint() ;
// aggiungo eventuale offset all'altra
if ( fabs( dOffsetPar) > EPS_PARAM)
PL.AddOffsetToU( dOffsetPar) ;
// sposto i punti dall'altra polilinea a questa e aggiorno i contatori
m_lUPoints.splice( m_lUPoints.end(), PL.m_lUPoints) ;
m_nCount += PL.GetPointNbr() ;
PL.m_nCount = 0 ;
@@ -216,6 +228,32 @@ PolyLine::Splice( PolyLine& PL)
return true ;
}
//----------------------------------------------------------------------------
bool
PolyLine::Split( double dU, PolyLine& PL)
{
// pulisco la polilinea destinazione
PL.Clear() ;
// ricerca del punto in cui dividere
UPNTLIST::const_iterator iter ;
iter = m_lUPoints.begin() ;
while ( iter != m_lUPoints.end() && iter->first < ( dU + EPS_PARAM))
++ iter ;
if ( iter == m_lUPoints.end())
return false ;
// sposto i punti nell'altra polilinea
PL.m_lUPoints.splice( PL.m_lUPoints.end(), m_lUPoints, iter, m_lUPoints.end()) ;
PL.m_nCount = int( PL.m_lUPoints.size()) ;
m_nCount -= PL.m_nCount ;
// prepongo l'ultimo punto rimasto
PL.m_lUPoints.push_front( m_lUPoints.back()) ;
++ PL.m_nCount ;
// annullo l'iteratore corrente
m_iter = m_lUPoints.end() ;
return true ;
}
//----------------------------------------------------------------------------
bool
PolyLine::IsClosed( void) const