From 990bc1a1e49196a410cd5a7a3cbabf2ee5c5fa34 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Fri, 25 Oct 2024 17:18:59 +0200 Subject: [PATCH] EgtGeomKernel : - migliorato controllo precisione percorsi per proiezione curve su superfici. --- ProjectCurveSurfTm.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ProjectCurveSurfTm.cpp b/ProjectCurveSurfTm.cpp index 0c9b30d..d04e6ab 100644 --- a/ProjectCurveSurfTm.cpp +++ b/ProjectCurveSurfTm.cpp @@ -45,6 +45,8 @@ RemovePointsInExcess( PNT5AXVECTOR& vMyPt5ax, double dLinTol, double dMaxSegmLen // rimuovo i punti allineati entro la tolleranza e non pił lontani tra loro del massimo double dSqMaxLen = dMaxSegmLen * dMaxSegmLen ; double dSqTol = dLinTol * dLinTol ; + const double LENREF = 100 ; + double dCosAngLim = 1 - dSqTol / ( 2 * LENREF * LENREF) ; int nPrec = 0 ; int nCurr = 1 ; int nNext = 2 ; @@ -62,7 +64,7 @@ RemovePointsInExcess( PNT5AXVECTOR& vMyPt5ax, double dLinTol, double dMaxSegmLen // verifico se errore angolare inferiore a limite double dPar ; dPL.GetParamAtMinDistPoint( dPar) ; Vector3d vtNew = Media( vMyPt5ax[nPrec].vtDir, vMyPt5ax[nNext].vtDir, dPar) ; - if ( vtNew.Normalize() && vtNew * vMyPt5ax[nCurr].vtDir > cos( 2 * DEGTORAD)) + if ( vtNew.Normalize() && vtNew * vMyPt5ax[nCurr].vtDir > dCosAngLim) bRemove = true ; } } @@ -97,7 +99,7 @@ ProjectCurveOnSurfTm( const ICurve& crCrv, const ISurfTriMesh& tmSurf, const Vec PolyLine PL ; if ( ! crCrv.ApproxWithLines( EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) return false ; - const double MAX_SEG_LEN = min( dMaxSegmLen, 1.) ; + const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ; if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN)) return false ; @@ -174,7 +176,7 @@ ProjectCurveOnSurfTm( const ICurve& crCrv, const ISurfTriMesh& tmSurf, const IGe PolyLine PL ; if ( ! crCrv.ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) return false ; - const double MAX_SEG_LEN = min( dMaxSegmLen, 1.) ; + const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ; if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN)) return false ; @@ -252,7 +254,7 @@ ProjectCurveOnSurfTm( const ICurve& crCrv, const ISurfTriMesh& tmSurf, const ICu PolyLine PL ; if ( ! crCrv.ApproxWithLines( EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) return false ; - const double MAX_SEG_LEN = min( dMaxSegmLen, 1.) ; + const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ; if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN)) return false ; @@ -334,7 +336,7 @@ ProjectCurveOnSurfTm( const ICurve& crCrv, const ISurfTriMesh& tmSurf, const ISu PolyLine PL ; if ( ! crCrv.ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL)) return false ; - const double MAX_SEG_LEN = min( dMaxSegmLen, 1.) ; + const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ; if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN)) return false ;