From d37a5a37b7a82cf45b5128c82412df678b67c5e9 Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 15 May 2025 14:40:34 +0200 Subject: [PATCH] EgtGeomKernel : - piccola correzione in GetSideAtMinDistPoint in un caso particolare di punto minimo nello start di curva chiusa. --- DistPointCurve.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/DistPointCurve.cpp b/DistPointCurve.cpp index b009273..c5dad76 100644 --- a/DistPointCurve.cpp +++ b/DistPointCurve.cpp @@ -152,7 +152,7 @@ DistPointCurve::GetMinDistPoint( double dNearParam, Point3d& ptMinDist, int& nFl } } - // cerco punto discreto pił vicino (anche estremi di zone continue) + // cerco punto discreto più vicino (anche estremi di zone continue) double dParam ; for ( int i = 0 ; i < (int) m_Info.size() ; ++ i) { if ( i == 0 || @@ -197,7 +197,7 @@ DistPointCurve::GetParamAtMinDistPoint( double dNearParam, double& dParam, int& } } - // cerco punto discreto pił vicino (anche estremi di zone continue) + // cerco punto discreto più vicino (anche estremi di zone continue) for ( int i = 0 ; i < (int) m_Info.size() ; ++ i) { if ( i == 0 || abs( m_Info[i].dPar - dNearParam) < abs( dParam - dNearParam)) { @@ -232,9 +232,20 @@ DistPointCurve::GetSideAtMinDistPoint( int nInd, const Vector3d& vtN, int& nSide Vector3d vtTg = 0.5 * ( vtPreTg + vtPostTg) ; // se tangenti opposte, si deve ricalcolare spostandosi un poco if ( ! vtTg.Normalize()) { - double dDeltaU = 1000 * EPS_PARAM ; - if ( ! m_pCurve->GetPointTang( m_Info[nInd].dPar - dDeltaU, ICurve::FROM_MINUS, ptQ, vtPreTg) || - ! m_pCurve->GetPointTang( m_Info[nInd].dPar + dDeltaU, ICurve::FROM_PLUS, ptQ, vtPostTg)) + double dDeltaU = 1000 * EPS_PARAM ; + double dParPre = m_Info[nInd].dPar - dDeltaU ; + double dParPost = m_Info[nInd].dPar + dDeltaU ; + // verifico se il parametro deve essere modificato per adattarsi a curva chiusa + if ( m_pCurve->IsClosed()) { + double dParS, dParE ; + m_pCurve->GetDomain( dParS, dParE) ; + if ( dParPre < dParS) + dParPre = dParE - dDeltaU ; + if ( dParPost > dParE) + dParPost = dParS + dDeltaU ; + } + if ( ! m_pCurve->GetPointTang( dParPre, ICurve::FROM_MINUS, ptQ, vtPreTg) || + ! m_pCurve->GetPointTang( dParPost, ICurve::FROM_PLUS, ptQ, vtPostTg)) return false ; vtTg = 0.5 * ( vtPreTg + vtPostTg) ; if ( ! vtTg.Normalize( EPS_ZERO)) @@ -264,7 +275,7 @@ DistPointCurve::GetSideAtMinDistPoint( double dNearParam, const Vector3d& vtN, i if ( m_dDist < 0 || m_Info.empty()) return false ; - // cerco punto discreto pił vicino (anche estremi di zone continue) + // cerco punto discreto più vicino (anche estremi di zone continue) int nInd ; double dParam ; for ( int i = 0 ; i < (int) m_Info.size() ; ++ i) {