From e598e7986fa9d2b13af577389ad865d3c38e0dcd Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Fri, 29 Nov 2024 18:17:40 +0100 Subject: [PATCH] EgtGeomKernel 2.6i1 : - aggiunta funzione FlattenAdv per spianare la polilinea sul suo piano medio. --- EgtGeomKernel.rc | Bin 11718 -> 11718 bytes PolyLine.cpp | 55 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index f4655db99bba84a1577f8f0e72e36a7ffef0d3aa..f3f7b948d6bfae015e9f2095d118c51d164d2be2 100644 GIT binary patch delta 284 zcmX>WeJpyzI%aKGhCGIJh8%`WhGK>c1_cHUhESkLCPN8BDnkm89}HwAf_cT0FKS6| z{=m$_%xc7-!(h1iHs5)s$u(R$lRrqRFy}BBPTnXWzF9yij&bt@Za0J?Yi78lfzT2b zxMmb_pr#&aBu!XN4k6XK2PfatnK${Bng}n*W1e8IN?D*QkySo HePsdwqz_B^ delta 289 zcmX>WeJpyzI%aiGhCGIJh8%`ehGHOAV9;O)W+-7u1ma8}FBB-731Uyas3kpFPd#gM z9Lp>wRzn6I2BXdQ`OY&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