EgtGeomKernel 2.6i1 :

- aggiunta funzione FlattenAdv per spianare la polilinea sul suo piano medio.
This commit is contained in:
Dario Sassi
2024-11-29 18:17:40 +01:00
parent 9bebd2f2ad
commit e598e7986f
2 changed files with 46 additions and 9 deletions
+46 -9
View File
@@ -1085,15 +1085,8 @@ PolyLine::Invert( bool bInvertU)
//----------------------------------------------------------------------------
bool
PolyLine::Flatten( double dZ)
PolyLine::MyRemoveSamePoints( double dToler)
{
// verifico non sia vuota
if ( m_lUPoints.empty())
return true ;
// ciclo su tutti gli elementi per portarli alla Z indicata
for ( auto& UPoint : m_lUPoints) {
UPoint.first.z = dZ ;
}
// elimino i punti consecutivi diventati coincidenti (almeno 2)
if ( m_lUPoints.size() < 2)
return true ;
@@ -1104,7 +1097,7 @@ PolyLine::Flatten( double dZ)
// mentre esiste un corrente
while ( currP != m_lUPoints.end()) {
// se coincidono
if ( AreSamePointApprox( precP->first, currP->first)) {
if ( AreSamePointEpsilon( precP->first, currP->first, dToler)) {
// elimino il punto corrente
currP = m_lUPoints.erase( currP) ;
// il precedente rimane inalterato
@@ -1119,6 +1112,50 @@ PolyLine::Flatten( double dZ)
return true ;
}
//----------------------------------------------------------------------------
bool
PolyLine::Flatten( double dZ)
{
// verifico non sia vuota
if ( m_lUPoints.empty())
return true ;
// ciclo su tutti gli elementi per portarli alla Z indicata
for ( auto& UPoint : m_lUPoints)
UPoint.first.z = dZ ;
// elimino i punti consecutivi diventati coincidenti
MyRemoveSamePoints() ;
return true ;
}
//----------------------------------------------------------------------------
bool
PolyLine::FlattenAdv( double dToler)
{
// verifico non sia vuota
if ( m_lUPoints.empty())
return true ;
// recupero dati sulla planarità della polilinea
int nRank ;
Point3d ptCen ;
Vector3d vtDir ;
bool bFlat = IsFlat( nRank, ptCen, vtDir, dToler) ;
// se non planare entro la tolleranza, esco
if ( ! bFlat)
return false ;
// se punto o linea, non devo fare alcunché
if ( nRank == 0 || nRank == 1)
return true ;
// assegno il piano medio
Plane3d plPlane ;
plPlane.Set( ptCen, vtDir) ;
// proietto i punti su questo piano
for ( auto& UPoint : m_lUPoints)
UPoint.first = ProjectPointOnPlane( UPoint.first, plPlane) ;
// elimino i punti consecutivi diventati coincidenti
MyRemoveSamePoints() ;
return true ;
}
//----------------------------------------------------------------------------
bool
PolyLine::GetConvexHullXY( PNTVECTOR& vConvHull) const