From 2b1d2a512daf1cdea970dfbe861e131db720c45c Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Mon, 27 Apr 2026 15:03:49 +0200 Subject: [PATCH] EgtGeomKernel : - rimosso flag di debug. --- Trimming.cpp | 102 +++++++++++++++++++++++++-------------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/Trimming.cpp b/Trimming.cpp index ec38924..ef0431f 100644 --- a/Trimming.cpp +++ b/Trimming.cpp @@ -63,7 +63,7 @@ #define DEBUG_EDGES 0 #define DEBUG_SHAPE_STM 0 #define DEBUG_HOLES 0 -#define DEBUG_SMOOTH_CURVATURE 1 +#define DEBUG_SMOOTH_CURVATURE 0 #if DEBUG_BASIC_BORDERS || DEBUG_CHAIN_CURVES || DEBUG_ANG_APPROX || DEBUG_BEZIER_INTERP || \ DEBUG_FACE_SEARCH || DEBUG_FACE_SEARCH_TRIA_MODIF || DEBUG_BRK_POINTS || DEBUG_BRK_THICK || \ DEBUG_BRK || DEBUG_BORDERS_BY_NORMALS || DEBUG_SYNC_POINTS || DEBUG_SYNC_INTERPOLATION || \ @@ -4938,55 +4938,55 @@ FillPntInfo( const PNTVECTOR& vPnt, const ICurveComposite* pCC, PNTINFOVECTOR& v return true ; } -////------------------------------------------------------------------------------ -//static bool -//RemoveInflexionPoints( PNTVECTOR& vPnt, PNTINFOVECTOR& vPntInfo, PNTINFOVECTOR& vPntRefInfo) -//{ -// // se trovo tre punti di fila che sono dallo stesso lato, opposto a quello degli altri punti attorno, allora cerco di spostarli lungo la -// // normale alla superficie in modo da evitare cambi di concavità -// bool bSameSideAsPrev = true ; -// for ( int i = 2 ; i < ssize( vPntInfo) - 2 ; ++i) { -// int nPrev = vPntInfo[i-1].dDist < EPS_ZERO ? i - 2 : i - 1 ; -// double dProj = vPntInfo[i].vtPos * vPntInfo[nPrev].vtPos ; -// bSameSideAsPrev = vPntInfo[i].dDist < EPS_ZERO || dProj >= 0 ; -// if ( ! bSameSideAsPrev) { -// // devo verificare anche che sia diverso anche dal successivo ( o dal quello dopo ancora, se il successivo sta sulla curva) -// bool bCurrOrPrev = vPntInfo[i+1].dDist < EPS_ZERO ; -// int nFirst, nSecond, nThird ; -// if ( bCurrOrPrev) { -// nFirst = i ; -// nSecond = i + 1 ; -// nThird = i + 2 ; -// } -// else { -// nFirst = i - 2 ; -// nSecond = i - 1 ; -// nThird = i ; -// } -// int nNext = bCurrOrPrev ? i + 2 : i + 1 ; -// // se il successivo è diverso ho un terzetto anomalo da aggiustare -// // altrimenti ho un cambio naturale di concavità -// if ( vPntInfo[i].vtPos * vPntInfo[nNext].vtPos < 0) { -// // ruoto il terzetto fino a matchare la tangente sull'altra curva -// Vector3d vtCurr = vPntInfo[nNext].pt - vPntInfo[i].pt ; -// Vector3d vtRef = vPntRefInfo[nNext].pt - vPntRefInfo[i].pt ; -// Vector3d vtAx = vPntRefInfo[nSecond].pt - vPntInfo[nSecond].pt ; -// bool bDet = false ; -// double dAng = 0 ; vtCurr.GetRotation(vtRef, vtAx, dAng, bDet) ; -// if ( dAng > 170) { -// dAng = 180 - dAng ; -// // devo capire quale delle due curve ha i punti di controllo incrociati (come conseguenza della correzione precedente) e rimediare -// // DA IMPLEMENTARE, eventualmente -// } -// -// vPnt[nFirst].Rotate( vPnt[nSecond], vtAx, dAng) ; -// vPnt[nThird].Rotate( vPnt[nSecond], vtAx, dAng) ; -// if ( bCurrOrPrev) -// i += 2 ; -// } -// } -// } -//} +//------------------------------------------------------------------------------ +static bool +RemoveInflexionPoints( PNTVECTOR& vPnt, PNTINFOVECTOR& vPntInfo, PNTINFOVECTOR& vPntRefInfo) +{ + // se trovo tre punti di fila che sono dallo stesso lato, opposto a quello degli altri punti attorno, allora cerco di spostarli lungo la + // normale alla superficie in modo da evitare cambi di concavità + bool bSameSideAsPrev = true ; + for ( int i = 2 ; i < ssize( vPntInfo) - 2 ; ++i) { + int nPrev = vPntInfo[i-1].dDist < EPS_ZERO ? i - 2 : i - 1 ; + double dProj = vPntInfo[i].vtPos * vPntInfo[nPrev].vtPos ; + bSameSideAsPrev = vPntInfo[i].dDist < EPS_ZERO || dProj >= 0 ; + if ( ! bSameSideAsPrev) { + // devo verificare anche che sia diverso anche dal successivo ( o dal quello dopo ancora, se il successivo sta sulla curva) + bool bCurrOrPrev = vPntInfo[i+1].dDist < EPS_ZERO ; + int nFirst, nSecond, nThird ; + if ( bCurrOrPrev) { + nFirst = i ; + nSecond = i + 1 ; + nThird = i + 2 ; + } + else { + nFirst = i - 2 ; + nSecond = i - 1 ; + nThird = i ; + } + int nNext = bCurrOrPrev ? i + 2 : i + 1 ; + // se il successivo è diverso ho un terzetto anomalo da aggiustare + // altrimenti ho un cambio naturale di concavità + if ( vPntInfo[i].vtPos * vPntInfo[nNext].vtPos < 0) { + // ruoto il terzetto fino a matchare la tangente sull'altra curva + Vector3d vtCurr = vPntInfo[nNext].pt - vPntInfo[i].pt ; + Vector3d vtRef = vPntRefInfo[nNext].pt - vPntRefInfo[i].pt ; + Vector3d vtAx = vPntRefInfo[nSecond].pt - vPntInfo[nSecond].pt ; + bool bDet = false ; + double dAng = 0 ; vtCurr.GetRotation(vtRef, vtAx, dAng, bDet) ; + if ( dAng > 170) { + dAng = 180 - dAng ; + // devo capire quale delle due curve ha i punti di controllo incrociati (come conseguenza della correzione precedente) e rimediare + // DA IMPLEMENTARE, eventualmente + } + + vPnt[nFirst].Rotate( vPnt[nSecond], vtAx, dAng) ; + vPnt[nThird].Rotate( vPnt[nSecond], vtAx, dAng) ; + if ( bCurrOrPrev) + i += 2 ; + } + } + } +} //------------------------------------------------------------------------------ // Funzione per la regolarizzazione delle curve di bordo di una lavorazione di trim @@ -5135,7 +5135,7 @@ RegolarizeBordersLocally( const ISurfBezier* pSurfBz, const BIPOINT& bpIsoStart, FillPntInfo( vPnt0, pCC1, vPntInfo1) ; FillPntInfo( vPnt1, pCC2, vPntInfo2) ; - //RemoveInflexionPoints( ) ; + RemoveInflexionPoints( ) ; // se trovo tre punti di fila che sono dallo stesso lato, opposto a quello degli altri punti attorno, allora cerco di spostarli lungo la // normale alla superficie in modo da evitare cambi di concavità