EgtGeomKernel :
- correzioni e migliorie a offset3d e surfextend.
This commit is contained in:
+29
-5
@@ -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 ;
|
||||
|
||||
Reference in New Issue
Block a user