equality support

This commit is contained in:
Pascal Serrarens 2024-05-12 15:32:46 +02:00
parent b1e34b619e
commit 0c54276bd5
2 changed files with 37 additions and 31 deletions

View File

@ -73,12 +73,16 @@ float Angle::SineRuleAngle(float a, float beta, float b) {
*/ */
//---------------------- //----------------------
template <> Angle2<float> Angle2<float>::pi = 3.1415927410125732421875F; template <> AngleOf<float> AngleOf<float>::pi = 3.1415927410125732421875F;
template <> Angle2<float> Angle2<float>::Rad2Deg = 360.0f / (pi * 2); template <> AngleOf<float> AngleOf<float>::Rad2Deg = 360.0f / (pi * 2);
template <> Angle2<float> Angle2<float>::Deg2Rad = (pi * 2) / 360.0f; template <> AngleOf<float> AngleOf<float>::Deg2Rad = (pi * 2) / 360.0f;
template <> Angle2<float> Angle2<float>::Normalize(Angle2<float> angle) { template <> bool Passer::AngleOf<float>::operator==(AngleOf<float> a) {
return (float)*this == (float)a;
}
template <> AngleOf<float> AngleOf<float>::Normalize(AngleOf<float> angle) {
float angleValue = angle; float angleValue = angle;
if (!isfinite(angleValue)) if (!isfinite(angleValue))
return angleValue; return angleValue;
@ -91,8 +95,8 @@ template <> Angle2<float> Angle2<float>::Normalize(Angle2<float> angle) {
} }
template <> template <>
Angle2<float> Angle2<float>::Clamp(Angle2<float> angle, Angle2<float> min, AngleOf<float> AngleOf<float>::Clamp(AngleOf<float> angle, AngleOf<float> min,
Angle2<float> max) { AngleOf<float> max) {
float normalizedAngle = Normalize(angle); float normalizedAngle = Normalize(angle);
float r = Float::Clamp(normalizedAngle, min, max); float r = Float::Clamp(normalizedAngle, min, max);
return r; return r;
@ -105,9 +109,9 @@ Angle2<float> Angle2<float>::Clamp(Angle2<float> angle, Angle2<float> min,
// } // }
template <> template <>
Angle2<float> Angle2<float>::MoveTowards(Angle2<float> fromAngle, AngleOf<float> AngleOf<float>::MoveTowards(AngleOf<float> fromAngle,
Angle2<float> toAngle, AngleOf<float> toAngle,
Angle2<float> maxAngle) { AngleOf<float> maxAngle) {
float d = toAngle - fromAngle; float d = toAngle - fromAngle;
float sign = signbit(d) ? -1 : 1; float sign = signbit(d) ? -1 : 1;
d = sign * Float::Clamp(fabs(d), 0, maxAngle); d = sign * Float::Clamp(fabs(d), 0, maxAngle);
@ -115,11 +119,11 @@ Angle2<float> Angle2<float>::MoveTowards(Angle2<float> fromAngle,
} }
template <> template <>
Angle2<float> Angle2<float>::CosineRuleSide(float a, float b, AngleOf<float> AngleOf<float>::CosineRuleSide(float a, float b,
Angle2<float> gamma) { AngleOf<float> gamma) {
float a2 = a * a; float a2 = a * a;
float b2 = b * b; float b2 = b * b;
float d = a2 + b2 - 2 * a * b * cos(gamma * Angle2<float>::Deg2Rad); float d = a2 + b2 - 2 * a * b * cos(gamma * AngleOf<float>::Deg2Rad);
// Catch edge cases where float inacuracies lead tot nans // Catch edge cases where float inacuracies lead tot nans
if (d < 0) if (d < 0)
return 0; return 0;
@ -129,7 +133,7 @@ Angle2<float> Angle2<float>::CosineRuleSide(float a, float b,
} }
template <> template <>
Angle2<float> Angle2<float>::CosineRuleAngle(float a, float b, float c) { AngleOf<float> AngleOf<float>::CosineRuleAngle(float a, float b, float c) {
float a2 = a * a; float a2 = a * a;
float b2 = b * b; float b2 = b * b;
float c2 = c * c; float c2 = c * c;
@ -145,8 +149,8 @@ Angle2<float> Angle2<float>::CosineRuleAngle(float a, float b, float c) {
} }
template <> template <>
Angle2<float> Angle2<float>::SineRuleAngle(float a, Angle2<float> beta, AngleOf<float> AngleOf<float>::SineRuleAngle(float a, AngleOf<float> beta,
float b) { float b) {
float alpha = asin(a * sin(beta * Angle::Deg2Rad) / b); float alpha = asin(a * sin(beta * Angle::Deg2Rad) / b);
return alpha; return alpha;
} }

34
Angle.h
View File

@ -7,36 +7,38 @@
namespace Passer { namespace Passer {
template <typename T> class Angle2 { template <typename T> class AngleOf {
public: public:
Angle2(){}; AngleOf(){};
Angle2(T v) : value(v) {} AngleOf(T v) : value(v) {}
operator T() { return value; } operator T() { return value; }
static Angle2<T> Rad2Deg; static AngleOf<T> Rad2Deg;
static Angle2<T> Deg2Rad; static AngleOf<T> Deg2Rad;
static Angle2<T> pi; static AngleOf<T> pi;
static Angle2<T> Normalize(Angle2<T> angle); bool AngleOf<T>::operator==(AngleOf<T> a);
static Angle2<T> Clamp(Angle2<T> angle, Angle2<T> min, Angle2<T> max);
static Angle2<T> Difference(Angle2<T> a, Angle2<T> b) { static AngleOf<T> Normalize(AngleOf<T> a);
Angle2<T> r = Normalize(b - a); static AngleOf<T> Clamp(AngleOf<T> a, AngleOf<T> min, AngleOf<T> max);
static AngleOf<T> Difference(AngleOf<T> a, AngleOf<T> b) {
AngleOf<T> r = Normalize(b - a);
return r; return r;
}; };
static Angle2<T> MoveTowards(Angle2<T> fromAngle, Angle2<T> toAngle, static AngleOf<T> MoveTowards(AngleOf<T> fromAngle, AngleOf<T> toAngle,
Angle2<T> maxAngle); AngleOf<T> maxAngle);
static Angle2<T> CosineRuleSide(float a, float b, Angle2<T> gamma); static AngleOf<T> CosineRuleSide(float a, float b, AngleOf<T> gamma);
static Angle2<T> CosineRuleAngle(float a, float b, float c); static AngleOf<T> CosineRuleAngle(float a, float b, float c);
static Angle2<T> SineRuleAngle(float a, Angle2<T> beta, float c); static AngleOf<T> SineRuleAngle(float a, AngleOf<T> beta, float c);
private: private:
T value; T value;
}; };
using Angle = Angle2<float>; using Angle = AngleOf<float>;
/* /*
class Angle { class Angle {
public: public: