From f144cda136caf0d03ba7185ad3d97cea8f518090 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Sun, 4 Jan 2026 12:55:28 +0100 Subject: [PATCH] EgtGeomKernel : - modifiche per consentire di proiettare curve chiuse su superfici conservando i punti di inizio e fine. --- PolyLine.cpp | 6 +++--- ProjectCurveSurf.cpp | 30 ++++++++++++++++++------------ 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/PolyLine.cpp b/PolyLine.cpp index f52f459..d11f74c 100644 --- a/PolyLine.cpp +++ b/PolyLine.cpp @@ -775,7 +775,7 @@ DouglasPeuckerSimplification( const PNTUVECTOR& vPtU, const double dSqTol, const //---------------------------------------------------------------------------- bool -PolyLine::RemoveAlignedPoints( double dToler) +PolyLine::RemoveAlignedPoints( double dToler, bool bStartEnd) { // se non ci sono almeno 3 punti, esco subito if ( m_lUPoints.size() < 3) @@ -825,8 +825,8 @@ PolyLine::RemoveAlignedPoints( double dToler) // ordino in senso crescente sort( vInd.begin(), vInd.end()) ; - // se chiusa e almeno 4 punti rimasti, controllo allineamento dell'inizio con precedente e successivo rimasti - if ( IsClosed() && vInd.size() >= 4) { + // se richiesto e chiusa e almeno 4 punti rimasti, controllo allineamento dell'inizio con precedente e successivo rimasti + if ( bStartEnd && IsClosed() && vInd.size() >= 4) { if ( DistPointLine( vPtU[vInd[0]].first, vPtU[vInd[1]].first, vPtU[vInd[int(vInd.size())-2]].first).IsEpsilon( dToler)) { vInd.erase( vInd.begin()) ; vInd.back() = vInd.front() ; diff --git a/ProjectCurveSurf.cpp b/ProjectCurveSurf.cpp index e845fb8..821d91d 100644 --- a/ProjectCurveSurf.cpp +++ b/ProjectCurveSurf.cpp @@ -1,7 +1,7 @@ //---------------------------------------------------------------------------- -// EgalTech 2023-2025 +// EgalTech 2023-2026 //---------------------------------------------------------------------------- -// File : ProjectCurveSurfTm.cpp Data : 29.08.25 Versione : 2.7h2 +// File : ProjectCurveSurfTm.cpp Data : 03.01.26 Versione : 3.1a1 // Contenuto : Implementazione funzioni proiezione curve su superficie Trimesh. // // @@ -311,9 +311,10 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, dLinTol = max( dLinTol, LIN_TOL_MIN) ; dMaxSegmLen = max( dMaxSegmLen, 10 * EPS_SMALL) ; - // approssimo la curva con una polilinea entro la metà della tolleranza + // approssimo la curva con una polilinea entro la tolleranza PolyLine PL ; - if ( ! crCrv.ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) + if ( ! crCrv.ApproxWithLines( 10 * EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL) || + ! PL.RemoveAlignedPoints( dLinTol, false) ) return false ; const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ; if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN)) @@ -443,9 +444,11 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const Vect // controllo le tolleranze dLinTol = max( dLinTol, LIN_TOL_MIN) ; dMaxSegmLen = max( dMaxSegmLen, 10 * EPS_SMALL) ; - // approssimo la curva con una polilinea alla massima risoluzione + + // approssimo la curva con una polilinea entro la tolleranza PolyLine PL ; - if ( ! crCrv.ApproxWithLines( EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) + if ( ! crCrv.ApproxWithLines( 10 * EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL) || + ! PL.RemoveAlignedPoints( dLinTol, false) ) return false ; const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ; if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN)) @@ -597,9 +600,10 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const IGeo dLinTol = max( dLinTol, LIN_TOL_MIN) ; dMaxSegmLen = max( dMaxSegmLen, 10 * EPS_SMALL) ; - // approssimo la curva con una polilinea entro la metà della tolleranza + // approssimo la curva con una polilinea entro la tolleranza PolyLine PL ; - if ( ! crCrv.ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) + if ( ! crCrv.ApproxWithLines( 10 * EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL) || + ! PL.RemoveAlignedPoints( dLinTol, false) ) return false ; const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ; if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN)) @@ -736,9 +740,10 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const ICur dLinTol = max( dLinTol, LIN_TOL_MIN) ; dMaxSegmLen = max( dMaxSegmLen, 10 * EPS_SMALL) ; - // Approssimo la curva con una polilinea alla massima risoluzione + // Approssimo la curva con una polilinea entro la tolleranza PolyLine PL ; - if ( ! crCrv.ApproxWithLines( EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) + if ( ! crCrv.ApproxWithLines( 10 * EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL) || + ! PL.RemoveAlignedPoints( dLinTol, false) ) return false ; const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ; if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN)) @@ -911,9 +916,10 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const ISur dLinTol = max( dLinTol, LIN_TOL_MIN) ; dMaxSegmLen = max( dMaxSegmLen, 10 * EPS_SMALL) ; - // approssimo la curva con una polilinea entro la metà della tolleranza + // approssimo la curva con una polilinea entro la tolleranza PolyLine PL ; - if ( ! crCrv.ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) + if ( ! crCrv.ApproxWithLines( 10 * EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL) || + ! PL.RemoveAlignedPoints( dLinTol, false) ) return false ; const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ; if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN))