From a124bd67c6793336999b8347b4646e153bb84fd1 Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Thu, 13 Apr 2023 09:25:02 +0200 Subject: [PATCH] helper functions for normalizing angles added --- src/common/QskArcMetrics.cpp | 25 ++++++++++++++++++++-- src/common/QskArcMetrics.h | 2 ++ src/common/QskFunctions.cpp | 40 ++++++++++++++++++++++++++++++++++++ src/common/QskFunctions.h | 6 ++++++ 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/src/common/QskArcMetrics.cpp b/src/common/QskArcMetrics.cpp index 81f3ac01..6981b45c 100644 --- a/src/common/QskArcMetrics.cpp +++ b/src/common/QskArcMetrics.cpp @@ -4,6 +4,7 @@ *****************************************************************************/ #include "QskArcMetrics.h" +#include "QskFunctions.h" #include #include @@ -38,12 +39,12 @@ void QskArcMetrics::setThickness( qreal thickness ) noexcept void QskArcMetrics::setStartAngle( qreal startAngle ) noexcept { - m_startAngle = startAngle; + m_startAngle = qskConstrainedDegrees( startAngle ); } void QskArcMetrics::setSpanAngle( qreal spanAngle ) noexcept { - m_spanAngle = spanAngle; + m_spanAngle = qBound( -360.0, spanAngle, 360.0 ); } void QskArcMetrics::setSizeMode( Qt::SizeMode sizeMode ) noexcept @@ -51,6 +52,26 @@ void QskArcMetrics::setSizeMode( Qt::SizeMode sizeMode ) noexcept m_sizeMode = sizeMode; } +bool QskArcMetrics::containsAngle( qreal angle ) const +{ + angle = qskConstrainedDegrees( angle ); + + if ( m_spanAngle >= 0.0 ) + { + if ( angle < m_startAngle ) + angle += 360.0; + + return ( angle >= m_startAngle ) && ( angle <= m_startAngle + m_spanAngle ); + } + else + { + if ( angle > m_startAngle ) + angle -= 360.0; + + return ( angle <= m_startAngle ) && ( angle >= m_startAngle + m_spanAngle ); + } +} + QskArcMetrics QskArcMetrics::interpolated( const QskArcMetrics& to, qreal ratio ) const noexcept { diff --git a/src/common/QskArcMetrics.h b/src/common/QskArcMetrics.h index b2ce35ce..ee087475 100644 --- a/src/common/QskArcMetrics.h +++ b/src/common/QskArcMetrics.h @@ -45,6 +45,8 @@ class QSK_EXPORT QskArcMetrics constexpr qreal endAngle() const noexcept; constexpr qreal angleAtRatio( qreal ratio ) const noexcept; + bool containsAngle( qreal ) const; + void setThickness( qreal ) noexcept; constexpr qreal thickness() const noexcept; diff --git a/src/common/QskFunctions.cpp b/src/common/QskFunctions.cpp index d61ab688..9ac4dd35 100644 --- a/src/common/QskFunctions.cpp +++ b/src/common/QskFunctions.cpp @@ -177,3 +177,43 @@ qreal qskFuzzyCeil( qreal value, qreal stepSize ) value = ( value - eps ) / stepSize; return std::ceil( value ) * stepSize; } + +double qskConstrainedDegrees( double degrees ) +{ + degrees = fmod( degrees, 360.0 ); + if ( degrees < 0.0 ) + degrees += 360.0; + + return degrees; +} + +float qskConstrainedDegrees( float degrees ) +{ + degrees = fmodf( degrees, 360.0f ); + if ( degrees < 0.0f ) + degrees += 360.0f; + + return degrees; +} + +double qskConstrainedRadians( double radians ) +{ + constexpr double pi2 = 2.0 * M_PI; + + radians = fmod( radians, pi2 ); + if ( radians < 0.0 ) + radians += pi2; + + return radians; +} + +float qskConstrainedRadians( double float ) +{ + constexpr float pi2 = 2.0f * M_PI; + + radians = fmodf( radians, pi2 ); + if ( radians < 0.0f ) + radians += pi2; + + return radians; +} diff --git a/src/common/QskFunctions.h b/src/common/QskFunctions.h index 3a4e5cb6..f7287bd1 100644 --- a/src/common/QskFunctions.h +++ b/src/common/QskFunctions.h @@ -71,4 +71,10 @@ inline bool qskFuzzyCompare( qreal value1, qreal value2 ) QSK_EXPORT qreal qskFuzzyFloor( qreal value, qreal stepSize ); QSK_EXPORT qreal qskFuzzyCeil( qreal value, qreal stepSize ); +QSK_EXPORT double qskConstrainedDegrees( double ); +QSK_EXPORT float qskConstrainedDegrees( float ); + +QSK_EXPORT double qskConstrainedRadians( double ); +QSK_EXPORT float qskConstrainedRadians( float ); + #endif