//---------------------------------------------------------------------------- // 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) ; }