EgtGeomKernel :

- controllo più fine e piccolo miglioramento per identificaizone zone concave smooth.
This commit is contained in:
Daniele Bariletti
2026-06-08 12:38:18 +02:00
parent 88410333e9
commit 68e25e10e8
+16 -6
View File
@@ -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 ;
}