Improved unit tests

This commit is contained in:
Pascal Serrarens 2024-05-12 13:48:03 +02:00
parent 5489b3c45c
commit 6ddb074225
9 changed files with 165 additions and 33 deletions

View File

@ -9,15 +9,14 @@ Polar::Polar() {
distance = 0.0F;
}
// Polar::Polar(float newAngle, float newDistance) {
Polar::Polar(float newDistance, Angle newAngle) {
Polar::Polar(float distance, Angle angle) {
// distance should always be 0 or greater
if (newDistance < 0) {
angle = Angle::Normalize(newAngle - 180);
distance = -newDistance;
if (distance < 0) {
this->distance = -distance;
this->angle = Angle::Normalize(angle - 180);
} else {
angle = Angle::Normalize(newAngle);
distance = newDistance;
this->distance = distance;
this->angle = Angle::Normalize(angle);
}
}

View File

@ -19,9 +19,18 @@ Spherical::Spherical(Polar polar) {
this->distance = polar.distance;
}
Spherical::Spherical(float distance, Angle horizontalAngle, Angle verticalAngle)
: distance(distance), horizontalAngle(horizontalAngle),
verticalAngle(verticalAngle) {}
Spherical::Spherical(float distance, Angle horizontalAngle,
Angle verticalAngle) {
if (distance < 0) {
this->distance = -distance;
this->horizontalAngle = Angle::Normalize(horizontalAngle - 180);
this->verticalAngle = verticalAngle;
} else {
this->distance = distance;
this->horizontalAngle = Angle::Normalize(horizontalAngle);
this->verticalAngle = Angle::Normalize(verticalAngle);
}
}
Spherical::Spherical(Vector3 v) {
distance = v.magnitude();

View File

@ -33,6 +33,15 @@ Vector2::Vector2(Vector3 v) {
y = v.z;
}
Vector2::Vector2(Polar p) {
float horizontalRad = p.angle * Angle::Deg2Rad;
float cosHorizontal = cosf(horizontalRad);
float sinHorizontal = sinf(horizontalRad);
x = p.distance * sinHorizontal;
y = p.distance * cosHorizontal;
}
Vector2::~Vector2() {}
const Vector2 Vector2::zero = Vector2(0, 0);

View File

@ -27,6 +27,7 @@ typedef struct Vec2 {
namespace Passer {
struct Vector3;
struct Polar;
/// <summary>
/// A 2-dimensional vector
@ -56,6 +57,8 @@ public:
/// <param name="v">The 3D vector</param>
Vector2(Vector3 v);
Vector2(Polar p);
/// <summary>
/// Vector2 destructor
/// </summary
@ -246,4 +249,6 @@ public:
} // namespace Passer
using namespace Passer;
#include "Polar.h"
#endif

View File

@ -278,4 +278,6 @@ public:
} // namespace Passer
using namespace Passer;
#include "Spherical.h"
#endif

View File

@ -26,4 +26,46 @@ TEST(Polar, FromVector2) {
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";
}
TEST(Polar, FromSpherical) {
Spherical s;
Polar p;
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, 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)";
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)";
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)";
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)";
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)";
}
#endif

View File

@ -30,30 +30,41 @@ TEST(Spherical, FromVector3) {
EXPECT_FLOAT_EQ(s.verticalAngle, 0.0F) << "s.vert 1 0 0";
}
TEST(Spherical, ToVector3) {
Vector3 v = Vector3(0, 0, 1);
Spherical s = Spherical(v);
Vector3 r = Vector3(s); // s.ToVector3();
TEST(Spherical, FromPolar) {
Polar p = Polar(1, 0);
Spherical s = Spherical(p);
EXPECT_FLOAT_EQ(r.x, 0.0F) << "toVector3.x 0 0 1";
EXPECT_NEAR(r.y, 0.0F, 1.0e-06) << "toVector3.y 0 0 1";
EXPECT_FLOAT_EQ(r.z, 1.0F) << "toVector3.z 0 0 1";
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)";
v = Vector3(0, 1, 0);
s = Spherical(v);
r = Vector3(s); // s.ToVector3();
p = Polar(1, 45);
s = Spherical(p);
EXPECT_FLOAT_EQ(r.x, 0.0F) << "toVector3.x 0 1 0";
EXPECT_FLOAT_EQ(r.y, 1.0F) << "toVector3.y 0 1 0";
EXPECT_NEAR(r.z, 0.0F, 1.0e-06) << "toVector3.z 0 1 0";
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)";
v = Vector3(1, 0, 0);
s = Spherical(v);
r = Vector3(s); // s.ToVector3();
p = Polar(1, -45);
s = Spherical(p);
EXPECT_FLOAT_EQ(r.x, 1.0F) << "toVector3.x 1 0 0";
EXPECT_NEAR(r.y, 0.0F, 1.0e-06) << "toVector3.y 1 0 0";
EXPECT_NEAR(r.z, 0.0F, 1.0e-06) << "toVector3.z 1 0 0";
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)";
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)";
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)";
}
TEST(Spherical, Incident1) {
@ -65,7 +76,7 @@ TEST(Spherical, Incident1) {
EXPECT_NEAR(s.horizontalAngle, sr.horizontalAngle, 1.0e-02);
EXPECT_NEAR(s.verticalAngle, sr.verticalAngle, 1.0e-02);
Vector3 r = Vector3(sr); // sr.ToVector3();
Vector3 r = Vector3(sr);
EXPECT_NEAR(r.x, v.x, 1.0e-02) << "toVector3.x 1 0 0";
EXPECT_NEAR(r.y, v.y, 1.0e-02) << "toVector3.y 1 0 0";
EXPECT_NEAR(r.z, v.z, 1.0e-02) << "toVector3.z 1 0 0";
@ -80,7 +91,7 @@ TEST(Spherical, Incident2) {
EXPECT_NEAR(s.horizontalAngle, sr.horizontalAngle, 1.0e-05);
EXPECT_NEAR(s.verticalAngle, sr.verticalAngle, 1.0e-05);
Vector3 r = Vector3(sr); // sr.ToVector3();
Vector3 r = Vector3(sr);
EXPECT_NEAR(r.x, v.x, 1.0e-06);
EXPECT_NEAR(r.y, v.y, 1.0e-06);
EXPECT_NEAR(r.z, v.z, 1.0e-06);
@ -93,14 +104,14 @@ TEST(Spherical, Incident2) {
EXPECT_NEAR(s.horizontalAngle, sr.horizontalAngle, 1.0e-05);
EXPECT_NEAR(s.verticalAngle, sr.verticalAngle, 1.0e-05);
r = Vector3(sr); // sr.ToVector3();
r = Vector3(sr);
EXPECT_NEAR(r.x, v.x, 1.0e-06);
EXPECT_NEAR(r.y, v.y, 1.0e-06);
EXPECT_NEAR(r.z, v.z, 1.0e-06);
v = Vector3(1.0f, 1.0f, 1.0f);
s = Spherical(v);
r = Vector3(s); // s.ToVector3();
r = Vector3(s);
EXPECT_NEAR(s.distance, 1.73205080F, 1.0e-02);
EXPECT_NEAR(s.horizontalAngle, 45.0F, 1.0e-02);
@ -116,4 +127,5 @@ TEST(Spherical, Incident2) {
// EXPECT_NEAR(r.y, 7.07, 1.0e-06);
// EXPECT_NEAR(r.z, 5, 1.0e-06);
}
#endif

View File

@ -7,6 +7,33 @@
#define FLOAT_INFINITY std::numeric_limits<float>::infinity()
TEST(Vector2, FromPolar) {
Vector2 v;
Polar p;
Vector2 r;
v = Vector2(0, 1);
p = Polar(v);
r = Vector2(p);
EXPECT_FLOAT_EQ(r.x, 0.0F) << "FromPolar(0 1)";
EXPECT_FLOAT_EQ(r.y, 1.0F) << "FromPolar(0 1)";
v = Vector2(1, 0);
p = Polar(v);
r = Vector2(p);
EXPECT_FLOAT_EQ(r.x, 1.0F) << "FromPolar(1 0)";
EXPECT_NEAR(r.y, 0.0F, 1.0e-07) << "FromPolar(1 0)";
v = Vector2(0, 0);
p = Polar(v);
r = Vector2(p);
EXPECT_FLOAT_EQ(r.x, 0.0F) << "FromPolar(0 0)";
EXPECT_FLOAT_EQ(r.y, 0.0F) << "FromPolar(0 0)";
}
TEST(Vector2, Magnitude) {
Vector2 v = Vector2(1, 2);
float m = 0;

View File

@ -7,6 +7,32 @@
#define FLOAT_INFINITY std::numeric_limits<float>::infinity()
TEST(Vector3, FromSpherical) {
Vector3 v = Vector3(0, 0, 1);
Spherical s = Spherical(v);
Vector3 r = Vector3(s);
EXPECT_FLOAT_EQ(r.x, 0.0F) << "toVector3.x 0 0 1";
EXPECT_NEAR(r.y, 0.0F, 1.0e-06) << "toVector3.y 0 0 1";
EXPECT_FLOAT_EQ(r.z, 1.0F) << "toVector3.z 0 0 1";
v = Vector3(0, 1, 0);
s = Spherical(v);
r = Vector3(s);
EXPECT_FLOAT_EQ(r.x, 0.0F) << "toVector3.x 0 1 0";
EXPECT_FLOAT_EQ(r.y, 1.0F) << "toVector3.y 0 1 0";
EXPECT_NEAR(r.z, 0.0F, 1.0e-06) << "toVector3.z 0 1 0";
v = Vector3(1, 0, 0);
s = Spherical(v);
r = Vector3(s);
EXPECT_FLOAT_EQ(r.x, 1.0F) << "toVector3.x 1 0 0";
EXPECT_NEAR(r.y, 0.0F, 1.0e-06) << "toVector3.y 1 0 0";
EXPECT_NEAR(r.z, 0.0F, 1.0e-06) << "toVector3.z 1 0 0";
}
TEST(Vector3, Magnitude) {
Vector3 v = Vector3(1, 2, 3);
float m = 0;
@ -550,4 +576,5 @@ TEST(Vector3, Lerp) {
r = Vector3::Lerp(v1, v2, 2);
EXPECT_FLOAT_EQ(Vector3::Distance(r, Vector3(-2.0, -1.0f, 0.0f)), 0);
}
#endif