Improve math module (#396)
* Improve math module - Mark almost everything constexpr - Equality (a == b) is now exact, down to the bit level. If you want approximate equality use the new ApproxEqual method/static method - Rename Nz::Extend to Nz::Extent - Removed Make[] and Set[] methods in favor of their static counterpart and operator=
This commit is contained in:
@@ -189,6 +189,13 @@ namespace Nz
|
||||
{
|
||||
}
|
||||
|
||||
template<AngleUnit Unit, typename T>
|
||||
template<typename U>
|
||||
constexpr Angle<Unit, T>::Angle(const Angle<Unit, U>& angle) :
|
||||
value(static_cast<T>(angle.value))
|
||||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Constructs an Angle object from a angle in a specific unit, converting if required
|
||||
*
|
||||
@@ -201,6 +208,18 @@ namespace Nz
|
||||
{
|
||||
}
|
||||
|
||||
template<AngleUnit Unit, typename T>
|
||||
constexpr bool Angle<Unit, T>::ApproxEqual(const Angle& angle) const
|
||||
{
|
||||
return ApproxEqual(angle, Detail::AngleUtils<Unit>::template GetEpsilon<T>());
|
||||
}
|
||||
|
||||
template<AngleUnit Unit, typename T>
|
||||
constexpr bool Angle<Unit, T>::ApproxEqual(const Angle& angle, T maxDifference) const
|
||||
{
|
||||
return NumberEquals(value, angle.value, maxDifference);
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Computes the cosine of the angle
|
||||
* \return Cosine of angle
|
||||
@@ -254,16 +273,6 @@ namespace Nz
|
||||
return std::tan(ToRadians());
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Changes the angle value to zero
|
||||
*/
|
||||
template<AngleUnit Unit, typename T>
|
||||
constexpr Angle<Unit, T>& Angle<Unit, T>::MakeZero()
|
||||
{
|
||||
value = T(0);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Normalizes the angle value
|
||||
*
|
||||
@@ -284,33 +293,6 @@ namespace Nz
|
||||
return *this;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Copies the angle value of an angle
|
||||
*
|
||||
* \param Angle Angle which will be copied
|
||||
*/
|
||||
template<AngleUnit Unit, typename T>
|
||||
constexpr Angle<Unit, T>& Angle<Unit, T>::Set(Angle ang)
|
||||
{
|
||||
value = ang.value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Changes the angle value to the same as an Angle of a different type
|
||||
*
|
||||
* \param Angle Angle which will be casted
|
||||
*
|
||||
* \remark Conversion from U to T occurs using static_cast
|
||||
*/
|
||||
template<AngleUnit Unit, typename T>
|
||||
template<typename U>
|
||||
constexpr Angle<Unit, T>& Angle<Unit, T>::Set(const Angle<Unit, U>& ang)
|
||||
{
|
||||
value = static_cast<T>(ang.value);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Returns the ToUnit angle that is equivalent to this one
|
||||
* \return Equivalent ToUnit angle value
|
||||
@@ -586,7 +568,7 @@ namespace Nz
|
||||
template<AngleUnit Unit, typename T>
|
||||
constexpr bool Angle<Unit, T>::operator==(Angle other) const
|
||||
{
|
||||
return NumberEquals(value, other.value, Detail::AngleUtils<Unit>::template GetEpsilon<T>());
|
||||
return value == other.value;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -598,7 +580,43 @@ namespace Nz
|
||||
template<AngleUnit Unit, typename T>
|
||||
constexpr bool Angle<Unit, T>::operator!=(Angle other) const
|
||||
{
|
||||
return !NumberEquals(value, other.value, Detail::AngleUtils<Unit>::template GetEpsilon<T>());
|
||||
return value != other.value;
|
||||
}
|
||||
|
||||
template<AngleUnit Unit, typename T>
|
||||
constexpr bool Angle<Unit, T>::operator<(Angle other) const
|
||||
{
|
||||
return value < other.value;
|
||||
}
|
||||
|
||||
template<AngleUnit Unit, typename T>
|
||||
constexpr bool Angle<Unit, T>::operator<=(Angle other) const
|
||||
{
|
||||
return value <= other.value;
|
||||
}
|
||||
|
||||
template<AngleUnit Unit, typename T>
|
||||
constexpr bool Angle<Unit, T>::operator>(Angle other) const
|
||||
{
|
||||
return value > other.value;
|
||||
}
|
||||
|
||||
template<AngleUnit Unit, typename T>
|
||||
constexpr bool Angle<Unit, T>::operator>=(Angle other) const
|
||||
{
|
||||
return value >= other.value;
|
||||
}
|
||||
|
||||
template<AngleUnit Unit, typename T>
|
||||
constexpr bool Angle<Unit, T>::ApproxEqual(const Angle& lhs, const Angle& rhs)
|
||||
{
|
||||
return lhs.ApproxEqual(rhs);
|
||||
}
|
||||
|
||||
template<AngleUnit Unit, typename T>
|
||||
constexpr bool Angle<Unit, T>::ApproxEqual(const Angle& lhs, const Angle& rhs, T maxDifference)
|
||||
{
|
||||
return lhs.ApproxEqual(rhs, maxDifference);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
Reference in New Issue
Block a user