EgtGeomKernel 1.8e4 :

- correzione a ApproxOnSide e MakeConvex di PolyLine per percorsi chiusi
- migliorie e correzioni Zmap.
This commit is contained in:
Dario Sassi
2017-05-25 09:40:56 +00:00
parent 0a98461e3e
commit 98299d118c
7 changed files with 304 additions and 2293 deletions
+68
View File
@@ -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 ;