diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index f4655db..f3f7b94 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/PolyLine.cpp b/PolyLine.cpp index 9557017..117ce9d 100644 --- a/PolyLine.cpp +++ b/PolyLine.cpp @@ -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