Files
EgtGeomKernel/Angle.cpp
T
Dario Sassi 3e8e7e2e2a EgtGeomKernel 1.5l1 :
- aggiornamento a VS2013
- migliorato SimpleOffset e implementato anche per CurveComposite
- il lato di offset ora viene dal segno dello spostamento ( + a destra, - a sinistra)
- il vettore estrusione ora è la normale al piano di offset (se non c'è uso Z+)
- aggiunto a tutte le entità geometriche membro m_nTempProp intero temporaneo
- migliorata DistPointCrvBezier e DistPointArc
- corretta IntersLineArc con linee che non giacciono nel piano XY
- corretta ModifyStart di CurveArc
- a PolyArc aggiunto metodo ParamLinearTransform
- aggiunta gestione riferimento di griglia (CPlane).
2014-12-17 15:03:29 +00:00

66 lines
2.4 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2014-2014
//----------------------------------------------------------------------------
// File : Angle.cpp Data : 16.12.14 Versione : 1.5l1
// Contenuto : Implementazione funzioni per gestione angoli.
//
//
//
// Modifiche : 14.07.14 DS Creazione modulo.
// 16.12.14 DS Aumentata robustezza AngleInSpan.
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "/EgtDev/Include/EGkAngle.h"
#include "/EgtDev/Include/EGkGeoConst.h"
//----------------------------------------------------------------------------
double
AngleNearAngle( double dAngDeg, double dAngRefDeg)
{
// devo portare l'angolo entro +/- un angolo piatto dal riferimento
while ( dAngDeg > dAngRefDeg + ANG_STRAIGHT + EPS_ANG_ZERO)
dAngDeg -= ANG_FULL ;
while ( dAngDeg < dAngRefDeg - ANG_STRAIGHT - EPS_ANG_ZERO)
dAngDeg += ANG_FULL ;
return dAngDeg ;
}
//----------------------------------------------------------------------------
double
DiffAngle( double dAng1Deg, double dAng2Deg)
{
double dAng1Near2Deg = AngleNearAngle( dAng1Deg, dAng2Deg) ;
return ( dAng1Near2Deg - dAng2Deg) ;
}
//----------------------------------------------------------------------------
double
MediaAngle( double dAng1Deg, double dAng2Deg, double dCoeff)
{
double dAng1Near2Deg = AngleNearAngle( dAng1Deg, dAng2Deg) ;
return ( dAng1Near2Deg * ( 1 - dCoeff) + dAng2Deg * dCoeff) ;
}
//----------------------------------------------------------------------------
bool
AngleInSpan( double dAngDeg, double dAngRefDeg, double dAngSpanDeg)
{
// differenza dalla posizione a metà dell'intervallo angolare
double dAngDiffDeg = DiffAngle( dAngDeg, dAngRefDeg + 0.5 * dAngSpanDeg) ;
// se intervallo nullo, anche differenza deve essere nulla
if ( fabs( dAngSpanDeg) < EPS_ANG_ZERO)
return ( fabs( dAngDiffDeg) < EPS_ANG_SMALL) ;
// deve essere non oltre metà intervallo dal suo centro
else {
double dHalfAngSpanDeg = fabs( 0.5 * dAngSpanDeg) ;
return ( dAngDiffDeg > - dHalfAngSpanDeg - EPS_ANG_SMALL &&
dAngDiffDeg < dHalfAngSpanDeg + EPS_ANG_SMALL) ;
}
}