From 6ddb07422589adadd628ffdf43a5e8728e53b995 Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Sun, 12 May 2024 13:48:03 +0200 Subject: [PATCH] Improved unit tests --- Polar.cpp | 13 +++++----- Spherical.cpp | 15 ++++++++--- Vector2.cpp | 9 +++++++ Vector2.h | 5 ++++ Vector3.h | 2 ++ test/Polar_test.cc | 42 ++++++++++++++++++++++++++++++ test/Spherical_test.cc | 58 +++++++++++++++++++++++++----------------- test/Vector2_test.cc | 27 ++++++++++++++++++++ test/Vector3_test.cc | 27 ++++++++++++++++++++ 9 files changed, 165 insertions(+), 33 deletions(-) diff --git a/Polar.cpp b/Polar.cpp index c12ae96..76276f6 100644 --- a/Polar.cpp +++ b/Polar.cpp @@ -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); } } diff --git a/Spherical.cpp b/Spherical.cpp index 4abebbb..0f9b2f5 100644 --- a/Spherical.cpp +++ b/Spherical.cpp @@ -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(); diff --git a/Vector2.cpp b/Vector2.cpp index 2d1ff19..5a1495a 100644 --- a/Vector2.cpp +++ b/Vector2.cpp @@ -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); diff --git a/Vector2.h b/Vector2.h index c95f0d5..19daeb1 100644 --- a/Vector2.h +++ b/Vector2.h @@ -27,6 +27,7 @@ typedef struct Vec2 { namespace Passer { struct Vector3; +struct Polar; /// /// A 2-dimensional vector @@ -56,6 +57,8 @@ public: /// The 3D vector Vector2(Vector3 v); + Vector2(Polar p); + /// /// Vector2 destructor /// ::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; diff --git a/test/Vector3_test.cc b/test/Vector3_test.cc index 2148937..483cbdb 100644 --- a/test/Vector3_test.cc +++ b/test/Vector3_test.cc @@ -7,6 +7,32 @@ #define FLOAT_INFINITY std::numeric_limits::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 \ No newline at end of file