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 ; }