EgtGeomKernel :

- correzioni e migliorie a offset3d e surfextend.
This commit is contained in:
Daniele Bariletti
2026-06-25 15:26:00 +02:00
parent 576eb1cb73
commit c1a2912970
3 changed files with 65 additions and 10 deletions
+29 -5
View File
@@ -405,27 +405,51 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf,
vtDirPrev = pt2 - pt1 ;
}
bool bFound = PL.GetFirstULine( &dPar, &ptP, &dParNext, &ptPNext) ;
Vector3d vtFirst = ptPNext - ptP ;
Vector3d vtFirst = ptPNext - ptP ; vtFirst.Normalize() ;
bool bClosed = PL.IsClosed() ;
bool bLast = false ;
Vector3d vtNormPrev = V_INVALID ;
while ( bFound) {
// se trovo proiezione, la salvo
Point5ax Pt5ax ;
if ( ProjectPointOnSurf( ptP, vpSurf, dPar, Pt5ax))
vPt5ax.emplace_back( Pt5ax) ;
// controllo che la normale trovata sia in linea con la precedente, se i due tratti erano abbastanza allineati
if ( ! bClosed && ssize( vPt5ax) > 2) {
Point5ax& pt5Curr = vPt5ax.back() ;
Point5ax& pt5Prev = vPt5ax.end()[-2] ;
Point5ax& pt5PrevPrev = vPt5ax.end()[-3] ;
Vector3d vtDirCurr = pt5Curr.ptP - pt5Prev.ptP ; vtDirCurr.Normalize() ;
Vector3d vtDirPrev = pt5Prev.ptP - pt5PrevPrev.ptP ; vtDirPrev.Normalize() ;
double dProjDir = vtDirCurr * vtDirPrev ;
if ( dProjDir > COS_ANG_MAX_CORNER) {
double dProjNorm = vPt5ax.back().vtDir1 * vtNormPrev ;
if ( dProjNorm < COS_ANG_MAX_CORNER) {
vPt5ax.back().vtDir1 = vtNormPrev ;
vPt5ax.back().vtDir2 = vtNormPrev ;
}
}
}
vtNormPrev = vPt5ax.back().vtDir1 ;
// se richiesta la tangente anziché la normale allora modifico il vettore associato al punto
Vector3d vtDir ;
if ( ! bNormOrTang) {
Vector3d vtNorm = vPt5ax.back().vtDir1 ;
if ( ! bLast)
if ( ! bLast) {
vtDir = ptPNext - ptP ;
vtDir.Normalize() ;
}
else if ( bClosed)
vtDir = vtFirst ;
else
vtDir = vtDirPrev ;
vtDirPrev = vtDir ;
if ( vtDirPrev.IsValid())
vtDir = Media( vtDir, vtDirPrev) ;
Vector3d vtDirTemp = vtDir ;
if ( vtDirPrev.IsValid()) {
double dProj = vtDir * vtDirPrev ;
if ( dProj > COS_ANG_MAX_CORNER)
vtDir = Media( vtDir, vtDirPrev) ;
}
vtDirPrev = vtDirTemp ;
Vector3d vtTang = vtDir ^ vtNorm ; vtTang.Normalize() ;
vPt5ax.back().vtDir1 = vtTang ;
vPt5ax.back().vtDir2 = vtTang ;