From 68e25e10e82477b2efe6ffdb004f2d8cc94f9578 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Mon, 8 Jun 2026 12:38:18 +0200 Subject: [PATCH] =?UTF-8?q?EgtGeomKernel=20:=20-=20controllo=20pi=C3=B9=20?= =?UTF-8?q?fine=20e=20piccolo=20miglioramento=20per=20identificaizone=20zo?= =?UTF-8?q?ne=20concave=20smooth.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectCurveSurf.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/ProjectCurveSurf.cpp b/ProjectCurveSurf.cpp index 2ddc1df..dc207ba 100644 --- a/ProjectCurveSurf.cpp +++ b/ProjectCurveSurf.cpp @@ -65,7 +65,7 @@ PointsInTolerance( const PNT5AXVECTOR& vPt5ax, int nPrec, int nCurr, int nNext, static bool AddPointsOnCorners( PNT5AXVECTOR& vPt5ax) { - const double dCosSmallAngle = cos( 2 * DEGTORAD) ; + const double dSinSmallAngle = sin( 0 * DEGTORAD) ; for ( int i = 1 ; i < ssize( vPt5ax) ; ++ i) { // precedente int j = i - 1 ; @@ -86,7 +86,7 @@ AddPointsOnCorners( PNT5AXVECTOR& vPt5ax) if ( i > 2) { int k = i - 2 ; // verifico la concavità anche tornando indietro lungo la linea - if ( ( vPt5ax[k].ptP - vPt5ax[j].ptP) * vPt5ax[i].vtDir1 < 0 != bConvex) { + if ( ( ( vPt5ax[k].ptP - vPt5ax[j].ptP) * vPt5ax[i].vtDir1 < 0) != bConvex) { LOG_WARN( GetEGkLogger(), "La superficie su cui si sta proiettando la curva ha delle normali incoerenti") return false ; } @@ -146,12 +146,22 @@ AddPointsOnCorners( PNT5AXVECTOR& vPt5ax) } } } - // guardo se la proiezione il tratto successivo, lungo la normale precedente dà un valore positivo ( angolo interno smooth) - else if ( ( vPt5ax[i].ptP - vPt5ax[j].ptP) * vPt5ax[j].vtDir1 > 0) { - // se concavo senza spigolo netto segnalo zona concava smooth - vPt5ax[i].nFlag = P5AX_SMOOTH_CONC ; + else { + // guardo se la proiezione il tratto successivo, lungo la normale precedente + maggiore di un angolo minimo ( angolo interno smooth) + Vector3d vtDirNext = vPt5ax[i].ptP - vPt5ax[j].ptP ; + vtDirNext.Normalize() ; + if ( vtDirNext * vPt5ax[j].vtDir1 > dSinSmallAngle) { + // se concavo senza spigolo netto segnalo zona concava smooth + vPt5ax[i].nFlag = P5AX_SMOOTH_CONC ; + } } } + + // riscorro tutto il vettore per vedere se ho creato delle zone concave smooth frammentate (separate solo da un tratto non classificato concavo), che quindi uniformo + for ( int i = 1 ; i < ssize( vPt5ax) - 1 ; ++ i) { + if ( vPt5ax[i].nFlag != P5AX_SMOOTH_CONC && vPt5ax[i-1].nFlag == P5AX_SMOOTH_CONC && vPt5ax[i+1].nFlag == P5AX_SMOOTH_CONC) + vPt5ax[i].nFlag = P5AX_SMOOTH_CONC ; + } return true ; }