EgtGeomKernel :
- correzione a creazione arco con Set2PNB quando deltaN < epsilon - dump di CurveComposite limitato a 1000 entità - correzione in Zmap a calcolo spillone con movimento ortogonale di sfera.
This commit is contained in:
+30
-41
@@ -699,7 +699,7 @@ VolZmap::AvoidCylinder( const Frame3d& frCyl, double dL, double dR) const
|
||||
// La funzione restituisce true in caso di intersezione, false altrimenti.
|
||||
bool
|
||||
VolZmap::IntersLineCylinder( const Point3d& ptLineSt, const Vector3d& vtLineDir,
|
||||
const Frame3d& CylFrame, double dH, double dR, bool bTapO, bool bTapL,
|
||||
const Frame3d& CylFrame, double dH, double dR, bool bTapB, bool bTapT,
|
||||
Point3d& ptInt1, Point3d& ptInt2, Vector3d& vtN1, Vector3d& vtN2)
|
||||
{
|
||||
Point3d ptP = ptLineSt ;
|
||||
@@ -740,7 +740,7 @@ VolZmap::IntersLineCylinder( const Point3d& ptLineSt, const Vector3d& vtLineDir,
|
||||
ptInt1.ToGlob( CylFrame) ;
|
||||
ptInt2.ToGlob( CylFrame) ;
|
||||
vtN1.ToGlob( CylFrame) ;
|
||||
vtN2.ToGlob( CylFrame) ;
|
||||
vtN2.ToGlob( CylFrame) ;
|
||||
return true ;
|
||||
}
|
||||
// Nessuna intersezione
|
||||
@@ -757,54 +757,43 @@ VolZmap::IntersLineCylinder( const Point3d& ptLineSt, const Vector3d& vtLineDir,
|
||||
// appartiene alla superficie
|
||||
|
||||
if ( nRoot == 2) {
|
||||
// Tolleranze per tagliare o meno i dexel a filo sulle
|
||||
// circonferenze di base e di top.
|
||||
double dEpsO = ( bTapO ? - EPS_SMALL : EPS_SMALL) ;
|
||||
double dEpsL = ( bTapL ? EPS_SMALL : - EPS_SMALL) ;
|
||||
// Punti d'intersezione trovati
|
||||
// Ordino i parametri di intersezione
|
||||
double dUmin = vdRoots[0] ;
|
||||
double dUmax = vdRoots[1] ;
|
||||
if ( dUmin > dUmax)
|
||||
swap( dUmin, dUmax) ;
|
||||
// Calcolo i punti d'intersezione (ordinati secondo Z crescente)
|
||||
ptInt1 = ptP + vdRoots[0] * vtV ;
|
||||
ptInt2 = ptP + vdRoots[1] * vtV ;
|
||||
|
||||
if ( ptInt1.z > ptInt2.z)
|
||||
swap( ptInt1, ptInt2) ;
|
||||
|
||||
// Setto le normali
|
||||
vtN1.Set( ( ORIG - ptInt1).x, ( ORIG - ptInt1).y, 0) ;
|
||||
vtN2.Set( ( ORIG - ptInt2).x, ( ORIG - ptInt2).y, 0) ;
|
||||
vtN1.Normalize() ;
|
||||
vtN2.Normalize() ;
|
||||
// Studio le soluzioni
|
||||
if ( ptInt1.z < dH + dEpsL) {
|
||||
if ( ptInt1.z > dEpsO) {
|
||||
if ( ptInt2.z > dH + dEpsL) {
|
||||
ptInt2 = ptP + ( ( dH - ptP.z) / vtV.z) * vtV ;
|
||||
vtN2.Set( 0, 0, -1) ;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ( ptInt2.z > dH + dEpsL) {
|
||||
ptInt1 = ptP - ( ptP.z / vtV.z) * vtV ;
|
||||
ptInt2 = ptP + ( ( dH - ptP.z) / vtV.z) * vtV ;
|
||||
vtN1.Set( 0, 0, 1) ;
|
||||
vtN2.Set( 0, 0, -1) ;
|
||||
}
|
||||
else if ( ptInt2.z > dEpsO) {
|
||||
ptInt1 = ptP - ( ptP.z / vtV.z) * vtV ;
|
||||
vtN1.Set( 0, 0, 1) ;
|
||||
}
|
||||
else
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
else
|
||||
// Quote limitazione, dipendenti dalla tappatura estremità
|
||||
double dZbot = ( bTapB ? -EPS_SMALL : EPS_SMALL) ;
|
||||
double dZtop = ( bTapT ? dH + EPS_SMALL : dH - EPS_SMALL) ;
|
||||
// Se intersezioni entrambe fuori dal cilindro limitato, non vanno considerate
|
||||
if ( ptInt2.z < dZbot || ptInt1.z > dZtop)
|
||||
return false ;
|
||||
|
||||
// Calcolo le normali
|
||||
vtN1.Set( ( ORIG - ptInt1).x, ( ORIG - ptInt1).y, 0) ;
|
||||
vtN1.Normalize() ;
|
||||
vtN2.Set( ( ORIG - ptInt2).x, ( ORIG - ptInt2).y, 0) ;
|
||||
vtN2.Normalize() ;
|
||||
// Limitazioni per intersezione con piano basso
|
||||
if ( ptInt1.z < dZbot - EPS_ZERO) {
|
||||
ptInt1 = ptP + Clamp( ( dZbot - ptP.z / vtV.z), dUmin, dUmax) * vtV ;
|
||||
vtN1.Set( 0, 0, 1) ;
|
||||
}
|
||||
// Limitazioni per intersezione con piano alto
|
||||
if ( ptInt2.z > dZtop + EPS_ZERO) {
|
||||
ptInt2 = ptP + Clamp( ( ( dZtop - ptP.z) / vtV.z), dUmin, dUmax) * vtV ;
|
||||
vtN2.Set( 0, 0, -1) ;
|
||||
}
|
||||
// Riporto le coordinate nel sistema di riferimento griglia
|
||||
ptInt1.ToGlob( CylFrame) ;
|
||||
ptInt2.ToGlob( CylFrame) ;
|
||||
vtN1.ToGlob( CylFrame) ;
|
||||
vtN2.ToGlob( CylFrame) ;
|
||||
}
|
||||
vtN2.ToGlob( CylFrame) ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user