EgtGeomKernel 1.8e4 :
- correzione a ApproxOnSide e MakeConvex di PolyLine per percorsi chiusi - migliorie e correzioni Zmap.
This commit is contained in:
@@ -734,6 +734,49 @@ PolyLine::RemoveAlignedPoints( double dToler)
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyLine::ApproxOnSide( const Vector3d& vtN, bool bLeftSide, double dToler)
|
||||
{
|
||||
// eseguo una prima approssimazione
|
||||
if ( ! MyApproxOnSide( vtN, bLeftSide, dToler))
|
||||
return false ;
|
||||
|
||||
// se polilinea aperta, finito
|
||||
if ( ! IsClosed())
|
||||
return true ;
|
||||
|
||||
// *** polilinea chiusa : devo sistemare a cavallo dell'inizio/fine ***
|
||||
|
||||
// sposto l'inizio dalla parte opposta
|
||||
MyChangeStartOnMiddle() ;
|
||||
// rifaccio l'approssimazione con 3/4 della tolleranza ammessa
|
||||
if ( ! MyApproxOnSide( vtN, bLeftSide, 0.75 * dToler))
|
||||
return false ;
|
||||
// risposto l'inizio dalla parte opposta, quindi lo porto vicino all'originale
|
||||
MyChangeStartOnMiddle() ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyLine::MyChangeStartOnMiddle( void)
|
||||
{
|
||||
// solo per polilinee chiuse
|
||||
if ( ! IsClosed())
|
||||
return false ;
|
||||
// cancello ultimo punto ( coincide con primo)
|
||||
m_lUPoints.pop_back() ;
|
||||
// sposto la metà iniziale dei punti alla fine
|
||||
for ( size_t i = 0 ; i < m_lUPoints.size() / 2 ; ++ i)
|
||||
m_lUPoints.splice( m_lUPoints.end(), m_lUPoints, m_lUPoints.begin()) ;
|
||||
// aggiungo punto finale come copia dell'iniziale
|
||||
m_lUPoints.push_back( m_lUPoints.front()) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyLine::MyApproxOnSide( const Vector3d& vtN, bool bLeftSide, double dToler)
|
||||
{
|
||||
// se non ci sono almeno 3 punti, esco subito
|
||||
if ( m_lUPoints.size() < 3)
|
||||
@@ -841,6 +884,31 @@ PolyLine::ApproxOnSide( const Vector3d& vtN, bool bLeftSide, double dToler)
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyLine::MakeConvex( const Vector3d& vtN, bool bLeftSide)
|
||||
{
|
||||
// eseguo una prima modifica
|
||||
if ( ! MyMakeConvex( vtN, bLeftSide))
|
||||
return false ;
|
||||
|
||||
// se polilinea aperta, finito
|
||||
if ( ! IsClosed())
|
||||
return true ;
|
||||
|
||||
// *** polilinea chiusa : devo sistemare a cavallo dell'inizio/fine ***
|
||||
|
||||
// sposto l'inizio dalla parte opposta
|
||||
MyChangeStartOnMiddle() ;
|
||||
// rifaccio la modifica
|
||||
if ( ! MyMakeConvex( vtN, bLeftSide))
|
||||
return false ;
|
||||
// risposto l'inizio dalla parte opposta, quindi lo porto vicino all'originale
|
||||
MyChangeStartOnMiddle() ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
PolyLine::MyMakeConvex( const Vector3d& vtN, bool bLeftSide)
|
||||
{
|
||||
// ciclo i controlli finchè non ci sono rimozioni
|
||||
bool bRemoved = true ;
|
||||
|
||||
Reference in New Issue
Block a user