EgtGeomKernel 1.5g2 :

- aggiunte intersezioni tra linee ed archi
- aggiunte intersezioni tra archi e archi
- aggiunte funzioni di utilità per angoli.
This commit is contained in:
Dario Sassi
2014-07-16 09:08:32 +00:00
parent 19fda49699
commit 56d6307a1c
19 changed files with 1357 additions and 99 deletions
+11 -27
View File
@@ -44,44 +44,28 @@ DistPointArc::DistPointArc( const Point3d& ptP, const ICurveArc& arArc)
void
DistPointArc::DistPointCircle( const Point3d& ptP, const ICurveArc& arArc)
{
// vettori ausiliari
Vector3d vtDiff = ptP - arArc.GetCenter() ;
double dDistN = vtDiff * arArc.GetNormVersor() ;
Vector3d vtDiffPlane = vtDiff - dDistN * arArc.GetNormVersor() ;
double dDistPlane = fabs( vtDiffPlane.Len() - arArc.GetRadius()) ;
// calcolo della distanza
if ( fabs( dDistPlane) > EPS_ZERO && fabs( dDistN) > EPS_ZERO)
m_dDist = sqrt( dDistPlane * dDistPlane + dDistN * dDistN) ;
else if ( fabs( dDistPlane) > EPS_ZERO)
m_dDist = dDistPlane ;
else if ( fabs( dDistN) > EPS_ZERO)
m_dDist = fabs( dDistN) ;
else
m_dDist = 0 ;
// calcolo del parametro del punto a minima distanza
if ( vtDiffPlane.Normalize()) {
bool bDet ;
double dAngDeg ;
double dParam ;
Point3d ptMinDist ;
arArc.GetStartVersor().GetRotation( vtDiffPlane, arArc.GetNormVersor(), dAngDeg, bDet) ;
if ( arArc.GetAngCenter() > 0 && dAngDeg < 0)
dAngDeg += 360 ;
else if ( arArc.GetAngCenter() < 0 && dAngDeg > 0)
dAngDeg -= 360 ;
dParam = dAngDeg / arArc.GetAngCenter() ;
// se il punto non sta sul centro dell'arco, posso calcolarne la posizione angolare
double dAngDeg ;
if ( arArc.CalcPointAngle( ptP, dAngDeg)) {
double dParam = dAngDeg / arArc.GetAngCenter() ;
if ( dParam < 0)
dParam = 0 ;
else if ( dParam > 1)
dParam = 1 ;
// calcolo del punto di minima distanza
Point3d ptMinDist ;
arArc.GetPointD1D2( dParam, ICurve::FROM_MINUS, ptMinDist) ;
// calcolo del valore di minima distanza
m_dDist = Dist( ptP, ptMinDist) ;
// salvo i dati
m_Info.push_back( MinDistPCInfo( MDPCI_NORMAL, dParam, ptMinDist)) ;
}
// altrimenti tutti i punti della circonferenza sono a minima distanza
else {
// calcolo del valore di minima distanza
m_dDist = sqrt( SqDist( ptP, arArc.GetCenter()) + arArc.GetRadius() * arArc.GetRadius()) ;
// salvo iniziale e finale, come estremi del range
Point3d ptMinDist ;
// tutti i punti della circonferenza sono a minima distanza salvo iniziale e finale
arArc.GetStartPoint( ptMinDist) ;
m_Info.push_back( MinDistPCInfo( MDPCI_START_CONT, 0, ptMinDist)) ;
arArc.GetEndPoint( ptMinDist) ;