4f60bd24b6
- aggiunte funzioni AdjustAngleInSpan, AngleInRange e AdjustAngleInRange.
120 lines
4.1 KiB
C++
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) ;
|
|
}
|