Make Angle -> float conversion explicit

This commit is contained in:
Pascal Serrarens 2024-08-05 10:03:42 +02:00
parent 608c45c1a7
commit 49c67405fc
15 changed files with 283 additions and 227 deletions

View File

@ -74,32 +74,37 @@ float Angle::SineRuleAngle(float a, float beta, float b) {
//----------------------
template <>
AngleOf<float>::AngleOf(int angle) : value(angle) {}
AngleOf<float>::AngleOf(int angle) : value((float)angle) {}
template <>
AngleOf<float>::AngleOf(float angle) : value(angle) {}
// template <>
// AngleOf<float>::operator float() const {
// return value;
// }
template <>
AngleOf<float>::operator float() const {
float AngleOf<float>::ToFloat() const {
return value;
}
template <>
AngleOf<float> AngleOf<float>::pi = 3.1415927410125732421875F;
// template <>
// AngleOf<float> AngleOf<float>::pi = 3.1415927410125732421875F;
template <>
AngleOf<float> AngleOf<float>::Rad2Deg = 360.0f / (pi * 2);
template <>
AngleOf<float> AngleOf<float>::Deg2Rad = (pi * 2) / 360.0f;
// template <>
// AngleOf<float> AngleOf<float>::Rad2Deg = 360.0f / (pi * 2);
// template <>
// AngleOf<float> AngleOf<float>::Deg2Rad = (pi * 2) / 360.0f;
template <>
bool Passer::LinearAlgebra::AngleOf<float>::operator==(AngleOf<float> a) {
return (float)*this == (float)a;
return this->ToFloat() == a.ToFloat();
}
template <>
AngleOf<float> AngleOf<float>::Normalize(AngleOf<float> angle) {
float angleValue = angle;
float angleValue = angle.ToFloat();
if (!isfinite(angleValue))
return angleValue;
@ -114,8 +119,8 @@ template <>
AngleOf<float> AngleOf<float>::Clamp(AngleOf<float> angle,
AngleOf<float> min,
AngleOf<float> max) {
float normalizedAngle = Normalize(angle);
float r = Float::Clamp(normalizedAngle, min, max);
float normalizedAngle = Normalize(angle).ToFloat();
float r = Float::Clamp(normalizedAngle, min.ToFloat(), max.ToFloat());
return r;
}
@ -129,10 +134,10 @@ template <>
AngleOf<float> AngleOf<float>::MoveTowards(AngleOf<float> fromAngle,
AngleOf<float> toAngle,
AngleOf<float> maxAngle) {
float d = toAngle - fromAngle;
float d = toAngle.ToFloat() - fromAngle.ToFloat();
int sign = signbit(d) ? -1 : 1;
d = sign * Float::Clamp(fabsf(d), 0, maxAngle);
return fromAngle + d;
d = sign * Float::Clamp(fabsf(d), 0, maxAngle.ToFloat());
return fromAngle.ToFloat() + d;
}
template <>
@ -141,7 +146,8 @@ AngleOf<float> AngleOf<float>::CosineRuleSide(float a,
AngleOf<float> gamma) {
float a2 = a * a;
float b2 = b * b;
float d = a2 + b2 - 2 * a * b * cos(gamma * AngleOf<float>::Deg2Rad);
float d = a2 + b2 -
2 * a * b * cosf(gamma.ToFloat() * Passer::LinearAlgebra::Deg2Rad);
// Catch edge cases where float inacuracies lead tot nans
if (d < 0)
return 0.0f;
@ -162,7 +168,8 @@ AngleOf<float> AngleOf<float>::CosineRuleAngle(float a, float b, float c) {
if (d <= -1)
return 180.0f;
float gamma = acos(d) * Angle::Rad2Deg;
float rad2deg = Passer::LinearAlgebra::Rad2Deg;
float gamma = acosf(d) * rad2deg;
return gamma;
}
@ -170,6 +177,7 @@ template <>
AngleOf<float> AngleOf<float>::SineRuleAngle(float a,
AngleOf<float> beta,
float b) {
float alpha = asin(a * sin(beta * Angle::Deg2Rad) / b);
float deg2rad = Passer::LinearAlgebra::Deg2Rad;
float alpha = asinf(a * sinf(beta.ToFloat() * deg2rad) / b);
return alpha;
}

11
Angle.h
View File

@ -8,13 +8,20 @@
namespace Passer {
namespace LinearAlgebra {
static float pi = 3.1415927410125732421875F;
static float Rad2Deg = 360.0f / (pi * 2);
static float Deg2Rad = (pi * 2) / 360.0f;
template <typename T>
class AngleOf {
public:
AngleOf() {};
AngleOf(int f);
AngleOf(float f);
operator float() const;
// operator float() const;
float ToFloat() const;
inline T GetBinary() const { return this->value; }
@ -28,7 +35,7 @@ class AngleOf {
static AngleOf<T> Normalize(AngleOf<T> 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);
AngleOf<T> r = Normalize(b.ToFloat() - a.ToFloat());
return r;
};
static AngleOf<T> MoveTowards(AngleOf<T> fromAngle,

View File

@ -23,8 +23,14 @@ AngleOf<signed short>::AngleOf(float angle) {
this->value = (signed short)(angle / 360.0F * 65536.0F);
}
// template <>
// AngleOf<signed short>::operator float() const {
// float f = ((this->value * 180) / 32768.0F);
// return f;
// }
template <>
AngleOf<signed short>::operator float() const {
float AngleOf<signed short>::ToFloat() const {
float f = ((this->value * 180) / 32768.0F);
return f;
}
@ -37,7 +43,8 @@ AngleOf<signed short> AngleOf<signed short>::CosineRuleSide(
AngleOf<signed short> gamma) {
float a2 = a * a;
float b2 = b * b;
float d = a2 + b2 - 2 * a * b * cosf(gamma * AngleOf<float>::Deg2Rad);
float d = a2 + b2 -
2 * a * b * cosf(gamma.ToFloat() * Passer::LinearAlgebra::Deg2Rad);
// Catch edge cases where float inacuracies lead tot nans
if (d < 0)
return 0.0f;
@ -61,6 +68,6 @@ AngleOf<signed short> AngleOf<signed short>::CosineRuleAngle(float a,
if (d <= -1)
return 180.0f;
float gamma = acosf(d) * Angle::Rad2Deg;
float gamma = acosf(d) * Passer::LinearAlgebra::Rad2Deg;
return gamma;
}

View File

@ -23,8 +23,14 @@ AngleOf<signed char>::AngleOf(float angle) {
this->value = (signed char)(f * 256.0F);
}
// template <>
// AngleOf<signed char>::operator float() const {
// float f = (this->value * 180) / 128.0F;
// return f;
// }
template <>
AngleOf<signed char>::operator float() const {
float AngleOf<signed char>::ToFloat() const {
float f = (this->value * 180) / 128.0F;
return f;
}

View File

@ -20,8 +20,9 @@ Axis::Axis(Angle horizontal, Angle vertical) {
};
Axis::Axis(Vector3 v) {
this->horizontalAngle = atan2f(v.Right(), v.Forward()) * Angle::Rad2Deg;
this->verticalAngle = 90 - acosf(v.Up()) * Angle::Rad2Deg;
this->horizontalAngle =
atan2f(v.Right(), v.Forward()) * Passer::LinearAlgebra::Rad2Deg;
this->verticalAngle = 90 - acosf(v.Up()) * Passer::LinearAlgebra::Rad2Deg;
}
const Axis Axis::forward = Axis(0.0f, 0.0f);
@ -32,8 +33,8 @@ const Axis Axis::left = Axis(-90.0f, 0.0f);
const Axis Axis::right = Axis(90.0f, 0.0f);
Vector3 Axis::ToVector3() {
Vector3 v =
Quaternion::Euler(-this->verticalAngle, this->horizontalAngle, 0) *
Vector3::forward;
Vector3 v = Quaternion::Euler(-(this->verticalAngle.ToFloat()),
this->horizontalAngle.ToFloat(), 0) *
Vector3::forward;
return v;
}

View File

@ -12,7 +12,7 @@ Polar::Polar(float distance, Angle angle) {
// distance should always be 0 or greater
if (distance < 0.0f) {
this->distance = -distance;
this->angle = Angle::Normalize(angle - 180);
this->angle = Angle::Normalize(angle.ToFloat() - 180.0f);
} else {
this->distance = distance;
if (this->distance == 0.0f)
@ -27,7 +27,8 @@ Polar::Polar(Vector2 v) {
this->angle = Vector2::SignedAngle(Vector2::forward, v);
}
Polar::Polar(Spherical v) {
this->distance = v.distance * cosf(v.verticalAngle * Angle::Deg2Rad);
this->distance = v.distance * cosf(v.verticalAngle.ToFloat() *
Passer::LinearAlgebra::Deg2Rad);
this->angle = v.horizontalAngle;
}
@ -38,7 +39,8 @@ const Polar Polar::right = Polar(1.0, 90.0f);
const Polar Polar::left = Polar(1.0, -90.0f);
bool Polar::operator==(const Polar& v) const {
return (this->distance == v.distance && this->angle == v.angle);
return (this->distance == v.distance &&
this->angle.ToFloat() == v.angle.ToFloat());
}
Polar Polar::Normalize(const Polar& v) {
@ -51,7 +53,7 @@ Polar Polar::normalized() const {
}
Polar Polar::operator-() const {
Polar v = Polar(this->distance, this->angle + 180);
Polar v = Polar(this->distance, this->angle.ToFloat() + 180.0f);
return v;
}
@ -69,7 +71,8 @@ Polar Polar::operator+(const Polar& v) const {
if (this->distance == 0.0f)
return v;
float deltaAngle = Angle::Normalize(v.angle - (float)this->angle);
float deltaAngle =
Angle::Normalize(v.angle.ToFloat() - this->angle.ToFloat()).ToFloat();
float rotation =
deltaAngle < 0.0f ? 180.0f + deltaAngle : 180.0f - deltaAngle;
@ -79,13 +82,14 @@ Polar Polar::operator+(const Polar& v) const {
}
float newDistance =
Angle::CosineRuleSide(v.distance, this->distance, rotation);
Angle::CosineRuleSide(v.distance, this->distance, rotation).ToFloat();
float angle = Angle::CosineRuleAngle(newDistance, this->distance, v.distance);
float angle =
Angle::CosineRuleAngle(newDistance, this->distance, v.distance).ToFloat();
float newAngle = deltaAngle < 0.0f ? (float)this->angle - angle
: (float)this->angle + angle;
newAngle = Angle::Normalize(newAngle);
float newAngle = deltaAngle < 0.0f ? this->angle.ToFloat() - angle
: this->angle.ToFloat() + angle;
newAngle = Angle::Normalize(newAngle).ToFloat();
Polar vector = Polar(newDistance, newAngle);
return vector;
}
@ -117,12 +121,13 @@ Polar Polar::operator/=(float f) {
float Polar::Distance(const Polar& v1, const Polar& v2) {
float d = Angle::CosineRuleSide(v1.distance, v2.distance,
(float)v2.angle - (float)v1.angle);
v2.angle.ToFloat() - v1.angle.ToFloat())
.ToFloat();
return d;
}
Polar Polar::Rotate(const Polar& v, Angle angle) {
Angle a = Angle::Normalize(v.angle + angle);
Angle a = Angle::Normalize(v.angle.ToFloat() + angle.ToFloat());
Polar r = Polar(v.distance, a);
return r;
}

View File

@ -22,7 +22,8 @@ Spherical::Spherical(float distance,
Angle verticalAngle) {
if (distance < 0) {
this->distance = -distance;
this->horizontalAngle = Angle::Normalize(horizontalAngle - 180);
this->horizontalAngle =
Angle::Normalize(horizontalAngle.ToFloat() - 180.0f);
this->verticalAngle = verticalAngle;
} else {
this->distance = distance;
@ -37,9 +38,10 @@ Spherical::Spherical(Vector3 v) {
this->verticalAngle = 0.0f;
this->horizontalAngle = 0.0f;
} else {
this->verticalAngle =
(90.0f - acosf(v.Up() / this->distance) * Angle::Rad2Deg);
this->horizontalAngle = atan2f(v.Right(), v.Forward()) * Angle::Rad2Deg;
this->verticalAngle = (90.0f - acosf(v.Up() / this->distance) *
Passer::LinearAlgebra::Rad2Deg);
this->horizontalAngle =
atan2f(v.Right(), v.Forward()) * Passer::LinearAlgebra::Rad2Deg;
}
}
@ -53,8 +55,8 @@ const Spherical Spherical::down = Spherical(1.0f, 0.0f, -90.0f);
bool Spherical::operator==(const Spherical& v) const {
return (this->distance == v.distance &&
this->horizontalAngle == v.horizontalAngle &&
this->verticalAngle == v.verticalAngle);
this->horizontalAngle.ToFloat() == v.horizontalAngle.ToFloat() &&
this->verticalAngle.ToFloat() == v.verticalAngle.ToFloat());
}
Spherical Spherical::Normalize(const Spherical& v) {
@ -67,8 +69,9 @@ Spherical Spherical::normalized() const {
}
Spherical Spherical::operator-() const {
Spherical v = Spherical(this->distance, this->horizontalAngle + 180.0f,
this->verticalAngle + 180.0f);
Spherical v =
Spherical(this->distance, this->horizontalAngle.ToFloat() + 180.0f,
this->verticalAngle.ToFloat() + 180.0f);
return v;
}
@ -207,15 +210,18 @@ Angle Spherical::AngleBetween(const Spherical& v1, const Spherical& v2) {
Spherical Spherical::Rotate(const Spherical& v,
Angle horizontalAngle,
Angle verticalAngle) {
Spherical r = Spherical(v.distance, v.horizontalAngle + horizontalAngle,
v.verticalAngle + verticalAngle);
Spherical r = Spherical(
v.distance, v.horizontalAngle.ToFloat() + horizontalAngle.ToFloat(),
v.verticalAngle.ToFloat() + verticalAngle.ToFloat());
return r;
}
Spherical Spherical::RotateHorizontal(const Spherical& v, Angle a) {
Spherical r = Spherical(v.distance, v.horizontalAngle + a, v.verticalAngle);
Spherical r = Spherical(v.distance, v.horizontalAngle.ToFloat() + a.ToFloat(),
v.verticalAngle.ToFloat());
return r;
}
Spherical Spherical::RotateVertical(const Spherical& v, Angle a) {
Spherical r = Spherical(v.distance, v.horizontalAngle, v.verticalAngle + a);
Spherical r = Spherical(v.distance, v.horizontalAngle.ToFloat(),
v.verticalAngle.ToFloat() + a.ToFloat());
return r;
}

View File

@ -13,7 +13,7 @@ Spherical16::Spherical16() {
Spherical16::Spherical16(Polar polar) {
this->distance = polar.distance;
this->horizontalAngle = Angle16(polar.angle);
this->horizontalAngle = Angle16(polar.angle.ToFloat());
this->verticalAngle = Angle16(0);
}
@ -22,7 +22,7 @@ Spherical16::Spherical16(float distance,
Angle16 verticalAngle) {
if (distance < 0) {
this->distance = -distance;
this->horizontalAngle = horizontalAngle - Angle16(180);
this->horizontalAngle = horizontalAngle.ToFloat() - Angle16(180).ToFloat();
this->verticalAngle = verticalAngle;
} else {
this->distance = distance;
@ -37,9 +37,10 @@ Spherical16::Spherical16(Vector3 v) {
this->verticalAngle = 0.0f;
this->horizontalAngle = 0.0f;
} else {
this->verticalAngle =
(90.0f - acosf(v.Up() / this->distance) * Angle::Rad2Deg);
this->horizontalAngle = atan2f(v.Right(), v.Forward()) * Angle::Rad2Deg;
this->verticalAngle = (90.0f - acosf(v.Up() / this->distance) *
Passer::LinearAlgebra::Rad2Deg);
this->horizontalAngle =
atan2f(v.Right(), v.Forward()) * Passer::LinearAlgebra::Rad2Deg;
}
}
@ -53,8 +54,8 @@ const Spherical16 Spherical16::down = Spherical16(1.0f, 0.0f, -90.0f);
bool Spherical16::operator==(const Spherical16& v) const {
return (this->distance == v.distance &&
this->horizontalAngle == v.horizontalAngle &&
this->verticalAngle == v.verticalAngle);
this->horizontalAngle.ToFloat() == v.horizontalAngle.ToFloat() &&
this->verticalAngle.ToFloat() == v.verticalAngle.ToFloat());
}
Spherical16 Spherical16::Normalize(const Spherical16& v) {
@ -67,16 +68,18 @@ Spherical16 Spherical16::normalized() const {
}
Spherical16 Spherical16::operator-() const {
Spherical16 v = Spherical16(this->distance, this->horizontalAngle + 180.0f,
this->verticalAngle + 180.0f);
Spherical16 v =
Spherical16(this->distance, this->horizontalAngle.ToFloat() + 180.0f,
this->verticalAngle.ToFloat() + 180.0f);
return v;
}
Spherical16 Spherical16::operator-(const Spherical16& s2) const {
Spherical thisSpherical = Spherical(
this->distance, (Angle)this->horizontalAngle, (Angle)this->verticalAngle);
Spherical spherical2 = Spherical(s2.distance, (Angle)s2.horizontalAngle,
(Angle)s2.verticalAngle);
Spherical thisSpherical =
Spherical(this->distance, this->horizontalAngle.ToFloat(),
this->verticalAngle.ToFloat());
Spherical spherical2 = Spherical(s2.distance, s2.horizontalAngle.ToFloat(),
s2.verticalAngle.ToFloat());
// let's do it the easy way...
Vector3 v1 = Vector3(thisSpherical);
@ -92,10 +95,11 @@ Spherical16 Spherical16::operator-=(const Spherical16& v) {
Spherical16 Spherical16::operator+(const Spherical16& s2) const {
// let's do it the easy way...
Vector3 v1 = Vector3(Spherical(this->distance, (float)this->horizontalAngle,
(float)this->verticalAngle));
Vector3 v2 = Vector3(Spherical(s2.distance, (float)s2.horizontalAngle,
(float)s2.verticalAngle));
Vector3 v1 =
Vector3(Spherical(this->distance, this->horizontalAngle.ToFloat(),
this->verticalAngle.ToFloat()));
Vector3 v2 = Vector3(Spherical(s2.distance, s2.horizontalAngle.ToFloat(),
s2.verticalAngle.ToFloat()));
Vector3 v = v1 + v2;
Spherical16 r = Spherical16(v);
return r;
@ -199,10 +203,10 @@ Angle Spherical16::AngleBetween(const Spherical16& v1, const Spherical16& v2) {
if (denominator < epsilon)
return 0.0f;
Vector3 v1_3 = Vector3(Spherical(v1.distance, (Angle)v1.horizontalAngle,
(Angle)v1.verticalAngle));
Vector3 v2_3 = Vector3(Spherical(v2.distance, (Angle)v2.horizontalAngle,
(Angle)v2.verticalAngle));
Vector3 v1_3 = Vector3(Spherical(v1.distance, v1.horizontalAngle.ToFloat(),
v1.verticalAngle.ToFloat()));
Vector3 v2_3 = Vector3(Spherical(v2.distance, v2.horizontalAngle.ToFloat(),
v2.verticalAngle.ToFloat()));
float dot = Vector3::Dot(v1_3, v2_3);
float fraction = dot / denominator;
if (isnan(fraction))
@ -216,17 +220,18 @@ Angle Spherical16::AngleBetween(const Spherical16& v1, const Spherical16& v2) {
Spherical16 Spherical16::Rotate(const Spherical16& v,
Angle horizontalAngle,
Angle verticalAngle) {
Spherical16 r = Spherical16(v.distance, v.horizontalAngle + horizontalAngle,
v.verticalAngle + verticalAngle);
Spherical16 r = Spherical16(
v.distance, v.horizontalAngle.ToFloat() + horizontalAngle.ToFloat(),
v.verticalAngle.ToFloat() + verticalAngle.ToFloat());
return r;
}
Spherical16 Spherical16::RotateHorizontal(const Spherical16& v, Angle a) {
Spherical16 r =
Spherical16(v.distance, v.horizontalAngle + a, v.verticalAngle);
Spherical16 r = Spherical16(
v.distance, v.horizontalAngle.ToFloat() + a.ToFloat(), v.verticalAngle);
return r;
}
Spherical16 Spherical16::RotateVertical(const Spherical16& v, Angle a) {
Spherical16 r =
Spherical16(v.distance, v.horizontalAngle, v.verticalAngle + a);
Spherical16 r = Spherical16(v.distance, v.horizontalAngle,
v.verticalAngle.ToFloat() + a.ToFloat());
return r;
}

View File

@ -30,7 +30,7 @@ Vector2::Vector2(Vector3 v) {
y = v.Forward(); // z;
}
Vector2::Vector2(Polar p) {
float horizontalRad = p.angle * Angle::Deg2Rad;
float horizontalRad = p.angle.ToFloat() * Passer::LinearAlgebra::Deg2Rad;
float cosHorizontal = cosf(horizontalRad);
float sinHorizontal = sinf(horizontalRad);
@ -156,11 +156,11 @@ float Vector2::SignedAngle(const Vector2& v1, const Vector2& v2) {
float angleFrom = atan2f(v1.y, v1.x);
float angleTo = atan2f(v2.y, v2.x);
return -(angleTo - angleFrom) * Angle::Rad2Deg;
return -(angleTo - angleFrom) * Passer::LinearAlgebra::Rad2Deg;
}
Vector2 Vector2::Rotate(const Vector2& v, Passer::LinearAlgebra::Angle a) {
float angleRad = a * Angle::Deg2Rad;
float angleRad = a.ToFloat() * Passer::LinearAlgebra::Deg2Rad;
#if defined(AVR)
float sinValue = sin(angleRad);
float cosValue = cos(angleRad); // * Angle::Deg2Rad);

View File

@ -31,8 +31,10 @@ Vector3::Vector3(Vector2 v) {
}
Vector3::Vector3(Spherical s) {
float verticalRad = (90 - s.verticalAngle) * Angle::Deg2Rad;
float horizontalRad = s.horizontalAngle * Angle::Deg2Rad;
float verticalRad =
(90.0f - s.verticalAngle.ToFloat()) * Passer::LinearAlgebra::Deg2Rad;
float horizontalRad =
s.horizontalAngle.ToFloat() * Passer::LinearAlgebra::Deg2Rad;
float cosVertical = cosf(verticalRad);
float sinVertical = sinf(verticalRad);
float cosHorizontal = cosf(horizontalRad);

View File

@ -9,158 +9,159 @@
#define FLOAT_INFINITY std::numeric_limits<float>::infinity()
TEST(Angle, Normalize) {
float r = 0;
Angle r = 0;
r = Angle::Normalize(90.0f);
EXPECT_FLOAT_EQ(r, 90) << "Normalize 90";
EXPECT_FLOAT_EQ(r.ToFloat(), 90) << "Normalize 90";
r = Angle::Normalize(-90);
EXPECT_FLOAT_EQ(r, -90) << "Normalize -90";
EXPECT_FLOAT_EQ(r.ToFloat(), -90) << "Normalize -90";
r = Angle::Normalize(270);
EXPECT_FLOAT_EQ(r, -90) << "Normalize 270";
EXPECT_FLOAT_EQ(r.ToFloat(), -90) << "Normalize 270";
r = Angle::Normalize(270 + 360);
EXPECT_FLOAT_EQ(r, -90) << "Normalize 270+360";
EXPECT_FLOAT_EQ(r.ToFloat(), -90) << "Normalize 270+360";
r = Angle::Normalize(-270);
EXPECT_FLOAT_EQ(r, 90) << "Normalize -270";
EXPECT_FLOAT_EQ(r.ToFloat(), 90) << "Normalize -270";
r = Angle::Normalize(-270 - 360);
EXPECT_FLOAT_EQ(r, 90) << "Normalize -270-360";
EXPECT_FLOAT_EQ(r.ToFloat(), 90) << "Normalize -270-360";
r = Angle::Normalize(0);
EXPECT_FLOAT_EQ(r, 0) << "Normalize 0";
EXPECT_FLOAT_EQ(r.ToFloat(), 0) << "Normalize 0";
if (std::numeric_limits<float>::is_iec559) {
r = Angle::Normalize(FLOAT_INFINITY);
EXPECT_FLOAT_EQ(r, FLOAT_INFINITY) << "Normalize INFINITY";
EXPECT_FLOAT_EQ(r.ToFloat(), FLOAT_INFINITY) << "Normalize INFINITY";
r = Angle::Normalize(-FLOAT_INFINITY);
EXPECT_FLOAT_EQ(r, -FLOAT_INFINITY) << "Normalize INFINITY";
EXPECT_FLOAT_EQ(r.ToFloat(), -FLOAT_INFINITY) << "Normalize INFINITY";
}
}
TEST(Angle, Clamp) {
float r = 0;
Angle r = 0;
r = Angle::Clamp(1, 0, 2);
EXPECT_FLOAT_EQ(r, 1) << "Clamp 1 0 2";
EXPECT_FLOAT_EQ(r.ToFloat(), 1) << "Clamp 1 0 2";
r = Angle::Clamp(-1, 0, 2);
EXPECT_FLOAT_EQ(r, 0) << "Clamp -1 0 2";
EXPECT_FLOAT_EQ(r.ToFloat(), 0) << "Clamp -1 0 2";
r = Angle::Clamp(3, 0, 2);
EXPECT_FLOAT_EQ(r, 2) << "Clamp 3 0 2";
EXPECT_FLOAT_EQ(r.ToFloat(), 2) << "Clamp 3 0 2";
r = Angle::Clamp(1, 0, 0);
EXPECT_FLOAT_EQ(r, 0) << "Clamp 1 0 0";
EXPECT_FLOAT_EQ(r.ToFloat(), 0) << "Clamp 1 0 0";
r = Angle::Clamp(0, 0, 0);
EXPECT_FLOAT_EQ(r, 0) << "Clamp 0 0 0";
EXPECT_FLOAT_EQ(r.ToFloat(), 0) << "Clamp 0 0 0";
r = Angle::Clamp(0, 1, -1);
EXPECT_FLOAT_EQ(r, 1) << "Clamp 0 1 -1";
EXPECT_FLOAT_EQ(r.ToFloat(), 1) << "Clamp 0 1 -1";
if (std::numeric_limits<float>::is_iec559) {
r = Angle::Clamp(1, 0, FLOAT_INFINITY);
EXPECT_FLOAT_EQ(r, 1) << "Clamp 1 0 INFINITY";
EXPECT_FLOAT_EQ(r.ToFloat(), 1) << "Clamp 1 0 INFINITY";
r = Angle::Clamp(1, -FLOAT_INFINITY, 1);
EXPECT_FLOAT_EQ(r, 1) << "Clamp 1 -INFINITY 1";
EXPECT_FLOAT_EQ(r.ToFloat(), 1) << "Clamp 1 -INFINITY 1";
}
}
TEST(Angle, Difference) {
float r = 0;
Angle r = 0;
r = Angle::Difference(0, 90);
EXPECT_FLOAT_EQ(r, 90) << "Difference 0 90";
EXPECT_FLOAT_EQ(r.ToFloat(), 90) << "Difference 0 90";
r = Angle::Difference(0, -90);
EXPECT_FLOAT_EQ(r, -90) << "Difference 0 -90";
EXPECT_FLOAT_EQ(r.ToFloat(), -90) << "Difference 0 -90";
r = Angle::Difference(0, 270);
EXPECT_FLOAT_EQ(r, -90) << "Difference 0 270";
EXPECT_FLOAT_EQ(r.ToFloat(), -90) << "Difference 0 270";
r = Angle::Difference(0, -270);
EXPECT_FLOAT_EQ(r, 90) << "Difference 0 -270";
EXPECT_FLOAT_EQ(r.ToFloat(), 90) << "Difference 0 -270";
r = Angle::Difference(90, 0);
EXPECT_FLOAT_EQ(r, -90) << "Difference 90 0";
EXPECT_FLOAT_EQ(r.ToFloat(), -90) << "Difference 90 0";
r = Angle::Difference(-90, 0);
EXPECT_FLOAT_EQ(r, 90) << "Difference -90 0";
EXPECT_FLOAT_EQ(r.ToFloat(), 90) << "Difference -90 0";
r = Angle::Difference(0, 0);
EXPECT_FLOAT_EQ(r, 0) << "Difference 0 0";
EXPECT_FLOAT_EQ(r.ToFloat(), 0) << "Difference 0 0";
r = Angle::Difference(90, 90);
EXPECT_FLOAT_EQ(r, 0) << "Difference 90 90";
EXPECT_FLOAT_EQ(r.ToFloat(), 0) << "Difference 90 90";
if (std::numeric_limits<float>::is_iec559) {
r = Angle::Difference(0, INFINITY);
EXPECT_FLOAT_EQ(r, INFINITY) << "Difference 0 INFINITY";
EXPECT_FLOAT_EQ(r.ToFloat(), INFINITY) << "Difference 0 INFINITY";
r = Angle::Difference(0, -INFINITY);
EXPECT_FLOAT_EQ(r, -INFINITY) << "Difference 0 -INFINITY";
EXPECT_FLOAT_EQ(r.ToFloat(), -INFINITY) << "Difference 0 -INFINITY";
r = Angle::Difference(-INFINITY, INFINITY);
EXPECT_FLOAT_EQ(r, INFINITY) << "Difference -INFINITY INFINITY";
EXPECT_FLOAT_EQ(r.ToFloat(), INFINITY) << "Difference -INFINITY INFINITY";
}
}
TEST(Angle, MoveTowards) {
float r = 0;
Angle r = 0;
r = Angle::MoveTowards(0, 90, 30);
EXPECT_FLOAT_EQ(r, 30) << "MoveTowards 0 90 30";
EXPECT_FLOAT_EQ(r.ToFloat(), 30) << "MoveTowards 0 90 30";
r = Angle::MoveTowards(0, 90, 90);
EXPECT_FLOAT_EQ(r, 90) << "MoveTowards 0 90 90";
EXPECT_FLOAT_EQ(r.ToFloat(), 90) << "MoveTowards 0 90 90";
r = Angle::MoveTowards(0, 90, 180);
EXPECT_FLOAT_EQ(r, 90) << "MoveTowards 0 90 180";
EXPECT_FLOAT_EQ(r.ToFloat(), 90) << "MoveTowards 0 90 180";
r = Angle::MoveTowards(0, 90, 270);
EXPECT_FLOAT_EQ(r, 90) << "MoveTowards 0 90 270";
EXPECT_FLOAT_EQ(r.ToFloat(), 90) << "MoveTowards 0 90 270";
r = Angle::MoveTowards(0, 90, -30);
EXPECT_FLOAT_EQ(r, -30) << "MoveTowards 0 90 -30";
EXPECT_FLOAT_EQ(r.ToFloat(), -30) << "MoveTowards 0 90 -30";
r = Angle::MoveTowards(0, -90, -30);
EXPECT_FLOAT_EQ(r, 30) << "MoveTowards 0 -90 -30";
EXPECT_FLOAT_EQ(r.ToFloat(), 30) << "MoveTowards 0 -90 -30";
r = Angle::MoveTowards(0, -90, -90);
EXPECT_FLOAT_EQ(r, 90) << "MoveTowards 0 -90 -90";
EXPECT_FLOAT_EQ(r.ToFloat(), 90) << "MoveTowards 0 -90 -90";
r = Angle::MoveTowards(0, -90, -180);
EXPECT_FLOAT_EQ(r, 180) << "MoveTowards 0 -90 -180";
EXPECT_FLOAT_EQ(r.ToFloat(), 180) << "MoveTowards 0 -90 -180";
r = Angle::MoveTowards(0, -90, -270);
EXPECT_FLOAT_EQ(r, 270) << "MoveTowards 0 -90 -270";
EXPECT_FLOAT_EQ(r.ToFloat(), 270) << "MoveTowards 0 -90 -270";
r = Angle::MoveTowards(0, 90, 0);
EXPECT_FLOAT_EQ(r, 0) << "MoveTowards 0 90 0";
EXPECT_FLOAT_EQ(r.ToFloat(), 0) << "MoveTowards 0 90 0";
r = Angle::MoveTowards(0, 0, 0);
EXPECT_FLOAT_EQ(r, 0) << "MoveTowards 0 0 0";
EXPECT_FLOAT_EQ(r.ToFloat(), 0) << "MoveTowards 0 0 0";
r = Angle::MoveTowards(0, 0, 30);
EXPECT_FLOAT_EQ(r, 0) << "MoveTowards 0 0 30";
EXPECT_FLOAT_EQ(r.ToFloat(), 0) << "MoveTowards 0 0 30";
if (std::numeric_limits<float>::is_iec559) {
r = Angle::MoveTowards(0, 90, FLOAT_INFINITY);
EXPECT_FLOAT_EQ(r, 90) << "MoveTowards 0 90 FLOAT_INFINITY";
EXPECT_FLOAT_EQ(r.ToFloat(), 90) << "MoveTowards 0 90 FLOAT_INFINITY";
r = Angle::MoveTowards(0, FLOAT_INFINITY, 30);
EXPECT_FLOAT_EQ(r, 30) << "MoveTowards 0 FLOAT_INFINITY 30";
EXPECT_FLOAT_EQ(r.ToFloat(), 30) << "MoveTowards 0 FLOAT_INFINITY 30";
r = Angle::MoveTowards(0, -90, -FLOAT_INFINITY);
EXPECT_FLOAT_EQ(r, FLOAT_INFINITY) << "MoveTowards 0 -90 -FLOAT_INFINITY";
EXPECT_FLOAT_EQ(r.ToFloat(), FLOAT_INFINITY)
<< "MoveTowards 0 -90 -FLOAT_INFINITY";
r = Angle::MoveTowards(0, -FLOAT_INFINITY, -30);
EXPECT_FLOAT_EQ(r, 30) << "MoveTowards 0 -FLOAT_INFINITY -30";
EXPECT_FLOAT_EQ(r.ToFloat(), 30) << "MoveTowards 0 -FLOAT_INFINITY -30";
}
}

View File

@ -12,53 +12,53 @@
TEST(Angle8, Construct) {
float angle = 0.0F;
Angle8 a = Angle8(angle);
float f = (float)a;
float f = a.ToFloat();
EXPECT_FLOAT_EQ(f, angle);
angle = -180.0F;
a = Angle8(angle);
f = (float)a;
f = a.ToFloat();
EXPECT_FLOAT_EQ(f, angle);
}
TEST(Angle8, Negate) {
float angle = 0;
Angle8 a = Angle8(angle);
a = -a;
float f = (float)a;
a = -a.ToFloat();
float f = a.ToFloat();
EXPECT_FLOAT_EQ(f, angle);
angle = 90.0F;
a = Angle8(angle);
a = -a;
f = (float)a;
a = -a.ToFloat();
f = a.ToFloat();
EXPECT_FLOAT_EQ(f, -angle);
}
TEST(Angle8, Add) {
Angle8 a = Angle8(0);
Angle8 b = Angle8(0.0F);
Angle8 r = a + b;
EXPECT_FLOAT_EQ((float)r, 0);
Angle8 r = a.ToFloat() + b.ToFloat();
EXPECT_FLOAT_EQ(r.ToFloat(), 0);
}
TEST(Angle16, Construct) {
Angle16 a = Angle16(0.0F);
float f = (float)a;
float f = a.ToFloat();
EXPECT_FLOAT_EQ(f, 0);
}
TEST(Angle16, Negate) {
float angle = 0;
Angle16 a = Angle16(angle);
a = -a;
float f = (float)a;
a = -a.ToFloat();
float f = a.ToFloat();
EXPECT_FLOAT_EQ(f, angle);
angle = 90.0F;
a = Angle16(angle);
a = -a;
f = (float)a;
a = -a.ToFloat();
f = a.ToFloat();
EXPECT_FLOAT_EQ(f, -angle);
}
#endif

View File

@ -1,7 +1,7 @@
#if GTEST
#include <gtest/gtest.h>
#include <limits>
#include <math.h>
#include <limits>
#include "Polar.h"
@ -12,19 +12,19 @@ TEST(Polar, FromVector2) {
Polar p = Polar(v);
EXPECT_FLOAT_EQ(p.distance, 1.0F) << "p.distance 0 1";
EXPECT_FLOAT_EQ(p.angle, 0.0F) << "s.angle 0 0 1";
EXPECT_FLOAT_EQ(p.angle.ToFloat(), 0.0F) << "s.angle 0 0 1";
v = Vector2(1, 0);
p = Polar(v);
EXPECT_FLOAT_EQ(p.distance, 1.0F) << "p.distance 1 0";
EXPECT_FLOAT_EQ(p.angle, 90.0F) << "s.angle 1 0";
EXPECT_FLOAT_EQ(p.angle.ToFloat(), 90.0F) << "s.angle 1 0";
v = Vector2(-1, 1);
p = Polar(v);
EXPECT_FLOAT_EQ(p.distance, sqrt(2.0F)) << "p.distance -1 1";
EXPECT_NEAR(p.angle, -45.0F, 1.0e-05) << "s.angle -1 1";
EXPECT_NEAR(p.angle.ToFloat(), -45.0F, 1.0e-05) << "s.angle -1 1";
}
TEST(Polar, FromSpherical) {
@ -35,37 +35,38 @@ TEST(Polar, FromSpherical) {
p = Polar(s);
EXPECT_FLOAT_EQ(p.distance, 1.0F) << "p.distance FromSpherical(1 0 0)";
EXPECT_FLOAT_EQ(p.angle, 0.0F) << "p.angle FromSpherical(1 0 0)";
EXPECT_FLOAT_EQ(p.angle.ToFloat(), 0.0F) << "p.angle FromSpherical(1 0 0)";
s = Spherical(1, 45, 0);
p = Polar(s);
EXPECT_FLOAT_EQ(p.distance, 1.0F) << "p.distance FromSpherical(1 45 0)";
EXPECT_FLOAT_EQ(p.angle, 45.0F) << "p.angle FromSpherical(1 45 0)";
EXPECT_FLOAT_EQ(p.angle.ToFloat(), 45.0F) << "p.angle FromSpherical(1 45 0)";
s = Spherical(1, -45, 0);
p = Polar(s);
EXPECT_FLOAT_EQ(p.distance, 1.0F) << "p.distance FromSpherical(1 -45 0)";
EXPECT_FLOAT_EQ(p.angle, -45.0F) << "p.angle FromSpherical(1 -45 0)";
EXPECT_FLOAT_EQ(p.angle.ToFloat(), -45.0F)
<< "p.angle FromSpherical(1 -45 0)";
s = Spherical(0, 0, 0);
p = Polar(s);
EXPECT_FLOAT_EQ(p.distance, 0.0F) << "p.distance FromSpherical(0 0 0)";
EXPECT_FLOAT_EQ(p.angle, 0.0F) << "p.angle FromSpherical(0 0 0)";
EXPECT_FLOAT_EQ(p.angle.ToFloat(), 0.0F) << "p.angle FromSpherical(0 0 0)";
s = Spherical(-1, 0, 0);
p = Polar(s);
EXPECT_FLOAT_EQ(p.distance, 1.0F) << "p.distance FromSpherical(-1 0 0)";
EXPECT_FLOAT_EQ(p.angle, 180.0F) << "p.angle FromSpherical(-1 0 0)";
EXPECT_FLOAT_EQ(p.angle.ToFloat(), 180.0F) << "p.angle FromSpherical(-1 0 0)";
s = Spherical(0, 0, 90);
p = Polar(s);
EXPECT_FLOAT_EQ(p.distance, 0.0F) << "p.distance FromSpherical(0 0 90)";
EXPECT_FLOAT_EQ(p.angle, 0.0F) << "p.angle FromSpherical(0 0 90)";
EXPECT_FLOAT_EQ(p.angle.ToFloat(), 0.0F) << "p.angle FromSpherical(0 0 90)";
}
TEST(Polar, Negation) {
@ -74,7 +75,7 @@ TEST(Polar, Negation) {
r = -v;
EXPECT_FLOAT_EQ(r.distance, 2);
EXPECT_FLOAT_EQ(r.angle, -135);
EXPECT_FLOAT_EQ(r.angle.ToFloat(), -135);
EXPECT_TRUE(r == Polar(2, -135)) << "Negate(2 45)";
v = Polar(2, -45);
@ -88,7 +89,7 @@ TEST(Polar, Negation) {
v = Polar(0, 0);
r = -v;
EXPECT_FLOAT_EQ(r.distance, 0.0f);
EXPECT_FLOAT_EQ(r.angle, 0.0f);
EXPECT_FLOAT_EQ(r.angle.ToFloat(), 0.0f);
EXPECT_TRUE(r == Polar(0, 0)) << "Negate(0 0)";
}
@ -124,7 +125,7 @@ TEST(Polar, Addition) {
v2 = Polar(1, -45);
r = v1 + v2;
EXPECT_FLOAT_EQ(r.distance, sqrtf(2)) << "Addition(0 0 0)";
EXPECT_FLOAT_EQ(r.angle, 0) << "Addition(0 0 0)";
EXPECT_FLOAT_EQ(r.angle.ToFloat(), 0) << "Addition(0 0 0)";
}
TEST(Polar, Scale_Multiply) {
@ -133,7 +134,8 @@ TEST(Polar, Scale_Multiply) {
r = v1 * 2.0f;
EXPECT_FLOAT_EQ(r.distance, v1.distance * 2) << "ScaleMult(4 45, 2)";
EXPECT_FLOAT_EQ(r.angle, v1.angle) << "ScaleMult(4 45, 2)";
EXPECT_FLOAT_EQ(r.angle.ToFloat(), v1.angle.ToFloat())
<< "ScaleMult(4 45, 2)";
}
TEST(Polar, Scale_Divide) {
@ -142,7 +144,7 @@ TEST(Polar, Scale_Divide) {
r = v1 / 2.0f;
EXPECT_FLOAT_EQ(r.distance, v1.distance / 2) << "ScaleDiv(4 45, 2)";
EXPECT_FLOAT_EQ(r.angle, v1.angle) << "ScaleDiv(4 45, 2)";
EXPECT_FLOAT_EQ(r.angle.ToFloat(), v1.angle.ToFloat()) << "ScaleDiv(4 45, 2)";
}
TEST(Polar, Distance) {
@ -164,7 +166,7 @@ TEST(Polar, Rotate) {
r = Polar::Rotate(v, 45);
EXPECT_FLOAT_EQ(r.distance, v.distance) << "Rotate(4 45, 45)";
EXPECT_FLOAT_EQ(r.angle, 90.0f) << "Rotate(4 45, 45)";
EXPECT_FLOAT_EQ(r.angle.ToFloat(), 90.0f) << "Rotate(4 45, 45)";
}
#endif

View File

@ -12,22 +12,22 @@ TEST(Spherical16, FromVector3) {
Spherical16 s = Spherical16(v);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance 0 0 1";
EXPECT_FLOAT_EQ((float)s.horizontalAngle, 0.0F) << "s.hor 0 0 1";
EXPECT_FLOAT_EQ((float)s.verticalAngle, 0.0F) << "s.vert 0 0 1";
EXPECT_FLOAT_EQ((float)s.horizontalAngle.ToFloat(), 0.0F) << "s.hor 0 0 1";
EXPECT_FLOAT_EQ((float)s.verticalAngle.ToFloat(), 0.0F) << "s.vert 0 0 1";
v = Vector3(0, 1, 0);
s = Spherical16(v);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance 0 1 0";
EXPECT_FLOAT_EQ(s.horizontalAngle, 0.0F) << "s.hor 0 1 0";
EXPECT_FLOAT_EQ(s.verticalAngle, 90.0F) << "s.vert 0 1 0";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), 0.0F) << "s.hor 0 1 0";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 90.0F) << "s.vert 0 1 0";
v = Vector3(1, 0, 0);
s = Spherical16(v);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance 1 0 0";
EXPECT_FLOAT_EQ(s.horizontalAngle, 90.0F) << "s.hor 1 0 0";
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert 1 0 0";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), 90.0F) << "s.hor 1 0 0";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 0.0F) << "s.vert 1 0 0";
}
TEST(Spherical16, FromPolar) {
@ -35,36 +35,36 @@ TEST(Spherical16, FromPolar) {
Spherical16 s = Spherical16(p);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance Polar(1 0)";
EXPECT_FLOAT_EQ(s.horizontalAngle, 0.0F) << "s.hor Polar(1 0)";
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert Polar(1 0)";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), 0.0F) << "s.hor Polar(1 0)";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 0.0F) << "s.vert Polar(1 0)";
p = Polar(1, 45);
s = Spherical16(p);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance Polar(1 45)";
EXPECT_FLOAT_EQ(s.horizontalAngle, 45.0F) << "s.hor Polar(1 45)";
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert Polar(1 45)";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), 45.0F) << "s.hor Polar(1 45)";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 0.0F) << "s.vert Polar(1 45)";
p = Polar(1, -45);
s = Spherical16(p);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance Polar(1 -45)";
EXPECT_FLOAT_EQ(s.horizontalAngle, -45.0F) << "s.hor Polar(1 -45)";
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert Polar(1 -45)";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), -45.0F) << "s.hor Polar(1 -45)";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 0.0F) << "s.vert Polar(1 -45)";
p = Polar(0, 0);
s = Spherical16(p);
EXPECT_FLOAT_EQ(s.distance, 0.0F) << "s.distance Polar(0 0)";
EXPECT_FLOAT_EQ(s.horizontalAngle, 0.0F) << "s.hor Polar(0 0)";
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert Polar(0 0)";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), 0.0F) << "s.hor Polar(0 0)";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 0.0F) << "s.vert Polar(0 0)";
p = Polar(-1, 0);
s = Spherical16(p);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance Polar(-1 0)";
EXPECT_FLOAT_EQ(s.horizontalAngle, -180.0F) << "s.hor Polar(-1 0)";
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert Polar(-1 0)";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), -180.0F) << "s.hor Polar(-1 0)";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 0.0F) << "s.vert Polar(-1 0)";
}
TEST(Spherical16, Incident1) {
@ -73,11 +73,12 @@ TEST(Spherical16, Incident1) {
Spherical16 sr = Spherical16(2.49F, 98.18f, 24.4F);
EXPECT_NEAR(s.distance, sr.distance, 1.0e-01);
EXPECT_NEAR(s.horizontalAngle, sr.horizontalAngle, 1.0e-02);
EXPECT_NEAR(s.verticalAngle, sr.verticalAngle, 1.0e-02);
EXPECT_NEAR(s.horizontalAngle.ToFloat(), sr.horizontalAngle.ToFloat(),
1.0e-02);
EXPECT_NEAR(s.verticalAngle.ToFloat(), sr.verticalAngle.ToFloat(), 1.0e-02);
Vector3 r = Vector3(Spherical(sr.distance, (Angle)sr.horizontalAngle,
(Angle)sr.verticalAngle));
Vector3 r = Vector3(Spherical(sr.distance, sr.horizontalAngle.ToFloat(),
sr.verticalAngle.ToFloat()));
EXPECT_NEAR(r.Right(), v.Right(), 1.0e-02) << "toVector3.x 1 0 0";
EXPECT_NEAR(r.Up(), v.Up(), 1.0e-02) << "toVector3.y 1 0 0";
EXPECT_NEAR(r.Forward(), v.Forward(), 1.0e-02) << "toVector3.z 1 0 0";
@ -89,11 +90,12 @@ TEST(Spherical16, Incident2) {
Spherical16 sr = Spherical16(1.4142135623F, 45.0f, 0.0F);
EXPECT_NEAR(s.distance, sr.distance, 1.0e-05);
EXPECT_NEAR(s.horizontalAngle, sr.horizontalAngle, 1.0e-05);
EXPECT_NEAR(s.verticalAngle, sr.verticalAngle, 1.0e-05);
EXPECT_NEAR(s.horizontalAngle.ToFloat(), sr.horizontalAngle.ToFloat(),
1.0e-05);
EXPECT_NEAR(s.verticalAngle.ToFloat(), sr.verticalAngle.ToFloat(), 1.0e-05);
Vector3 r = Vector3(Spherical(sr.distance, (Angle)sr.horizontalAngle,
(Angle)sr.verticalAngle));
Vector3 r = Vector3(Spherical(sr.distance, sr.horizontalAngle.ToFloat(),
sr.verticalAngle.ToFloat()));
EXPECT_NEAR(r.Right(), v.Right(), 1.0e-06);
EXPECT_NEAR(r.Up(), v.Up(), 1.0e-06);
EXPECT_NEAR(r.Forward(), v.Forward(), 1.0e-06);
@ -103,23 +105,24 @@ TEST(Spherical16, Incident2) {
sr = Spherical16(1.4142135623F, 0.0f, 45.0F);
EXPECT_NEAR(s.distance, sr.distance, 1.0e-05);
EXPECT_NEAR(s.horizontalAngle, sr.horizontalAngle, 1.0e-05);
EXPECT_NEAR(s.verticalAngle, sr.verticalAngle, 1.0e-05);
EXPECT_NEAR(s.horizontalAngle.ToFloat(), sr.horizontalAngle.ToFloat(),
1.0e-05);
EXPECT_NEAR(s.verticalAngle.ToFloat(), sr.verticalAngle.ToFloat(), 1.0e-05);
r = Vector3(Spherical(sr.distance, (Angle)sr.horizontalAngle,
(Angle)sr.verticalAngle));
r = Vector3(Spherical(sr.distance, sr.horizontalAngle.ToFloat(),
sr.verticalAngle.ToFloat()));
EXPECT_NEAR(r.Right(), v.Right(), 1.0e-06);
EXPECT_NEAR(r.Up(), v.Up(), 1.0e-06);
EXPECT_NEAR(r.Forward(), v.Forward(), 1.0e-06);
v = Vector3(1.0f, 1.0f, 1.0f);
s = Spherical16(v);
r = Vector3(
Spherical(s.distance, (Angle)s.horizontalAngle, (Angle)s.verticalAngle));
r = Vector3(Spherical(s.distance, s.horizontalAngle.ToFloat(),
s.verticalAngle.ToFloat()));
EXPECT_NEAR(s.distance, 1.73205080F, 1.0e-02);
EXPECT_NEAR(s.horizontalAngle, 45.0F, 1.0e-02);
EXPECT_NEAR(s.verticalAngle, 35.26F, 1.0e-02);
EXPECT_NEAR(s.horizontalAngle.ToFloat(), 45.0F, 1.0e-02);
EXPECT_NEAR(s.verticalAngle.ToFloat(), 35.26F, 1.0e-02);
EXPECT_NEAR(r.Right(), v.Right(), 1.0e-04);
EXPECT_NEAR(r.Up(), v.Up(), 1.0e-04);
@ -147,14 +150,14 @@ TEST(Spherical16, Addition) {
v2 = Spherical16(1, -45, 0);
r = v1 + v2;
EXPECT_FLOAT_EQ(r.distance, sqrtf(2)) << "Addition(1 -45 0)";
EXPECT_FLOAT_EQ(r.horizontalAngle, 0) << "Addition(1 -45 0)";
EXPECT_FLOAT_EQ(r.verticalAngle, 0) << "Addition(1 -45 0)";
EXPECT_FLOAT_EQ(r.horizontalAngle.ToFloat(), 0) << "Addition(1 -45 0)";
EXPECT_FLOAT_EQ(r.verticalAngle.ToFloat(), 0) << "Addition(1 -45 0)";
v2 = Spherical16(1, 0, 90);
r = v1 + v2;
EXPECT_FLOAT_EQ(r.distance, sqrtf(2)) << "Addition(1 0 90)";
EXPECT_FLOAT_EQ(r.horizontalAngle, 45) << "Addition(1 0 90)";
EXPECT_FLOAT_EQ(r.verticalAngle, 45) << "Addition(1 0 90)";
EXPECT_FLOAT_EQ(r.horizontalAngle.ToFloat(), 45) << "Addition(1 0 90)";
EXPECT_FLOAT_EQ(r.verticalAngle.ToFloat(), 45) << "Addition(1 0 90)";
}
#endif

View File

@ -1,7 +1,7 @@
#if GTEST
#include <gtest/gtest.h>
#include <limits>
#include <math.h>
#include <limits>
#include "Spherical.h"
@ -12,22 +12,22 @@ TEST(Spherical, FromVector3) {
Spherical s = Spherical(v);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance 0 0 1";
EXPECT_FLOAT_EQ(s.horizontalAngle, 0.0F) << "s.hor 0 0 1";
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert 0 0 1";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), 0.0F) << "s.hor 0 0 1";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 0.0F) << "s.vert 0 0 1";
v = Vector3(0, 1, 0);
s = Spherical(v);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance 0 1 0";
EXPECT_FLOAT_EQ(s.horizontalAngle, 0.0F) << "s.hor 0 1 0";
EXPECT_FLOAT_EQ(s.verticalAngle, 90.0F) << "s.vert 0 1 0";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), 0.0F) << "s.hor 0 1 0";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 90.0F) << "s.vert 0 1 0";
v = Vector3(1, 0, 0);
s = Spherical(v);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance 1 0 0";
EXPECT_FLOAT_EQ(s.horizontalAngle, 90.0F) << "s.hor 1 0 0";
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert 1 0 0";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), 90.0F) << "s.hor 1 0 0";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 0.0F) << "s.vert 1 0 0";
}
TEST(Spherical, FromPolar) {
@ -35,36 +35,36 @@ TEST(Spherical, FromPolar) {
Spherical s = Spherical(p);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance Polar(1 0)";
EXPECT_FLOAT_EQ(s.horizontalAngle, 0.0F) << "s.hor Polar(1 0)";
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert Polar(1 0)";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), 0.0F) << "s.hor Polar(1 0)";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 0.0F) << "s.vert Polar(1 0)";
p = Polar(1, 45);
s = Spherical(p);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance Polar(1 45)";
EXPECT_FLOAT_EQ(s.horizontalAngle, 45.0F) << "s.hor Polar(1 45)";
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert Polar(1 45)";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), 45.0F) << "s.hor Polar(1 45)";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 0.0F) << "s.vert Polar(1 45)";
p = Polar(1, -45);
s = Spherical(p);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance Polar(1 -45)";
EXPECT_FLOAT_EQ(s.horizontalAngle, -45.0F) << "s.hor Polar(1 -45)";
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert Polar(1 -45)";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), -45.0F) << "s.hor Polar(1 -45)";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 0.0F) << "s.vert Polar(1 -45)";
p = Polar(0, 0);
s = Spherical(p);
EXPECT_FLOAT_EQ(s.distance, 0.0F) << "s.distance Polar(0 0)";
EXPECT_FLOAT_EQ(s.horizontalAngle, 0.0F) << "s.hor Polar(0 0)";
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert Polar(0 0)";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), 0.0F) << "s.hor Polar(0 0)";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 0.0F) << "s.vert Polar(0 0)";
p = Polar(-1, 0);
s = Spherical(p);
EXPECT_FLOAT_EQ(s.distance, 1.0F) << "s.distance Polar(-1 0)";
EXPECT_FLOAT_EQ(s.horizontalAngle, 180.0F) << "s.hor Polar(-1 0)";
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert Polar(-1 0)";
EXPECT_FLOAT_EQ(s.horizontalAngle.ToFloat(), 180.0F) << "s.hor Polar(-1 0)";
EXPECT_FLOAT_EQ(s.verticalAngle.ToFloat(), 0.0F) << "s.vert Polar(-1 0)";
}
TEST(Spherical, Incident1) {
@ -73,8 +73,9 @@ TEST(Spherical, Incident1) {
Spherical sr = Spherical(2.49F, 98.18f, 24.4F);
EXPECT_NEAR(s.distance, sr.distance, 1.0e-01);
EXPECT_NEAR(s.horizontalAngle, sr.horizontalAngle, 1.0e-02);
EXPECT_NEAR(s.verticalAngle, sr.verticalAngle, 1.0e-02);
EXPECT_NEAR(s.horizontalAngle.ToFloat(), sr.horizontalAngle.ToFloat(),
1.0e-02);
EXPECT_NEAR(s.verticalAngle.ToFloat(), sr.verticalAngle.ToFloat(), 1.0e-02);
Vector3 r = Vector3(sr);
EXPECT_NEAR(r.Right(), v.Right(), 1.0e-02) << "toVector3.x 1 0 0";
@ -88,8 +89,9 @@ TEST(Spherical, Incident2) {
Spherical sr = Spherical(1.4142135623F, 45.0f, 0.0F);
EXPECT_NEAR(s.distance, sr.distance, 1.0e-05);
EXPECT_NEAR(s.horizontalAngle, sr.horizontalAngle, 1.0e-05);
EXPECT_NEAR(s.verticalAngle, sr.verticalAngle, 1.0e-05);
EXPECT_NEAR(s.horizontalAngle.ToFloat(), sr.horizontalAngle.ToFloat(),
1.0e-05);
EXPECT_NEAR(s.verticalAngle.ToFloat(), sr.verticalAngle.ToFloat(), 1.0e-05);
Vector3 r = Vector3(sr);
EXPECT_NEAR(r.Right(), v.Right(), 1.0e-06);
@ -101,8 +103,9 @@ TEST(Spherical, Incident2) {
sr = Spherical(1.4142135623F, 0.0f, 45.0F);
EXPECT_NEAR(s.distance, sr.distance, 1.0e-05);
EXPECT_NEAR(s.horizontalAngle, sr.horizontalAngle, 1.0e-05);
EXPECT_NEAR(s.verticalAngle, sr.verticalAngle, 1.0e-05);
EXPECT_NEAR(s.horizontalAngle.ToFloat(), sr.horizontalAngle.ToFloat(),
1.0e-05);
EXPECT_NEAR(s.verticalAngle.ToFloat(), sr.verticalAngle.ToFloat(), 1.0e-05);
r = Vector3(sr);
EXPECT_NEAR(r.Right(), v.Right(), 1.0e-06);
@ -114,8 +117,8 @@ TEST(Spherical, Incident2) {
r = Vector3(s);
EXPECT_NEAR(s.distance, 1.73205080F, 1.0e-02);
EXPECT_NEAR(s.horizontalAngle, 45.0F, 1.0e-02);
EXPECT_NEAR(s.verticalAngle, 35.26F, 1.0e-02);
EXPECT_NEAR(s.horizontalAngle.ToFloat(), 45.0F, 1.0e-02);
EXPECT_NEAR(s.verticalAngle.ToFloat(), 35.26F, 1.0e-02);
EXPECT_NEAR(r.Right(), v.Right(), 1.0e-06);
EXPECT_NEAR(r.Up(), v.Up(), 1.0e-06);
@ -143,14 +146,14 @@ TEST(Spherical, Addition) {
v2 = Spherical(1, -45, 0);
r = v1 + v2;
EXPECT_FLOAT_EQ(r.distance, sqrtf(2)) << "Addition(1 -45 0)";
EXPECT_FLOAT_EQ(r.horizontalAngle, 0) << "Addition(1 -45 0)";
EXPECT_FLOAT_EQ(r.verticalAngle, 0) << "Addition(1 -45 0)";
EXPECT_FLOAT_EQ(r.horizontalAngle.ToFloat(), 0) << "Addition(1 -45 0)";
EXPECT_FLOAT_EQ(r.verticalAngle.ToFloat(), 0) << "Addition(1 -45 0)";
v2 = Spherical(1, 0, 90);
r = v1 + v2;
EXPECT_FLOAT_EQ(r.distance, sqrtf(2)) << "Addition(1 0 90)";
EXPECT_FLOAT_EQ(r.horizontalAngle, 45) << "Addition(1 0 90)";
EXPECT_FLOAT_EQ(r.verticalAngle, 45) << "Addition(1 0 90)";
EXPECT_FLOAT_EQ(r.horizontalAngle.ToFloat(), 45) << "Addition(1 0 90)";
EXPECT_FLOAT_EQ(r.verticalAngle.ToFloat(), 45) << "Addition(1 0 90)";
}
#endif