Files
DarioS 4f60bd24b6 EgtGeomKernel 2.5b1 :
- aggiunte funzioni AdjustAngleInSpan, AngleInRange e AdjustAngleInRange.
2023-02-10 11:26:00 +01:00

120 lines
4.1 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 ( abs( dAngSpanDeg) < EPS_ANG_ZERO)
return ( abs( dAngDiffDeg) < EPS_ANG_SMALL) ;
// deve essere non oltre metà intervallo dal suo centro
else {
double dHalfAngSpanDeg = abs( 0.5 * dAngSpanDeg) ;
return ( dAngDiffDeg > - dHalfAngSpanDeg - EPS_ANG_SMALL &&
dAngDiffDeg < dHalfAngSpanDeg + EPS_ANG_SMALL) ;
}
}
//----------------------------------------------------------------------------
bool
AngleInRange( double dAngDeg, double dAngMinDeg, double dAngMaxDeg)
{
return AngleInSpan( dAngDeg, ( dAngMinDeg + dAngMaxDeg) / 2, dAngMaxDeg - dAngMinDeg) ;
}
//----------------------------------------------------------------------------
bool
AdjustAngleInSpan( double& dAngDeg, double dAngRefDeg, double dAngSpanDeg)
{
// Verifico consistenza intervallo
if ( dAngSpanDeg < -EPS_ANG_ZERO)
return false ;
// Se intervallo vero
if ( dAngSpanDeg > EPS_ANG_SMALL) {
double dTryDeg = dAngDeg ;
// eseguo gli aggiustamenti
while ( dTryDeg < dAngRefDeg - dAngSpanDeg)
dTryDeg += ANG_FULL ;
while ( dTryDeg > dAngRefDeg + dAngSpanDeg)
dTryDeg -= ANG_FULL ;
// verifico
if ( dTryDeg >= dAngRefDeg - dAngSpanDeg && dTryDeg <= dAngRefDeg + dAngSpanDeg) {
dAngDeg = dTryDeg ;
return true ;
}
return false ;
}
// altrimenti un valore
else {
double dTryDeg = dAngDeg ;
// eseguo gli aggiustamenti
while ( dTryDeg < dAngRefDeg - EPS_ANG_SMALL)
dTryDeg += ANG_FULL ;
while ( dTryDeg > dAngRefDeg + EPS_ANG_SMALL)
dTryDeg -= ANG_FULL ;
// verifico
if ( abs( dTryDeg - dAngRefDeg) < EPS_ANG_SMALL) {
dAngDeg = dAngRefDeg ;
return true ;
}
else
return false ;
}
}
//----------------------------------------------------------------------------
bool
AdjustAngleInRange( double& dAngDeg, double dAngMinDeg, double dAngMaxDeg)
{
return AdjustAngleInSpan( dAngDeg, ( dAngMinDeg + dAngMaxDeg) / 2, dAngMaxDeg - dAngMinDeg) ;
}