helper functions for normalizing angles added

This commit is contained in:
Uwe Rathmann 2023-04-13 09:25:02 +02:00
parent 93fdaf79e6
commit a124bd67c6
4 changed files with 71 additions and 2 deletions

View File

@ -4,6 +4,7 @@
*****************************************************************************/
#include "QskArcMetrics.h"
#include "QskFunctions.h"
#include <qhashfunctions.h>
#include <qvariant.h>
@ -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
{

View File

@ -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;

View File

@ -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;
}

View File

@ -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