Addedfirst Polar test

This commit is contained in:
Pascal Serrarens 2024-03-14 12:37:22 +01:00
parent 395f82dc0c
commit 7b85556f1e
6 changed files with 61 additions and 8 deletions

View File

@ -43,6 +43,7 @@ else()
"test/Vector3_test.cc"
"test/Quaternion_test.cc"
"test/Matrix_test.cc"
"test/Polar_test.cc"
"test/Spherical_test.cc"
)
target_link_libraries(

View File

@ -19,6 +19,13 @@ Polar::Polar(float newAngle, float newDistance) {
}
}
Polar::Polar(Vector2 v) {
angle = Vector2::SignedAngle(
Vector2::forward,
v); // atan2(v.x, sqrt(v.z * v.z + v.y * v.y)) * Angle::Rad2Deg;
distance = v.magnitude();
}
const Polar Polar::zero = Polar(0, 0);
float Polar::Distance(const Polar &v1, const Polar &v2) {

16
Polar.h
View File

@ -5,13 +5,15 @@
#ifndef POLAR_H
#define POLAR_H
struct Vector2;
/// <summary>
/// A polar vector
/// </summary>
/// This will use the polar coordinate system consisting of a angle from a
/// reference direction and a distance.
struct Polar {
public:
public:
/// <summary>
/// The angle in degrees, clockwise rotation
/// </summary>
@ -34,6 +36,8 @@ struct Polar {
/// <param name="distance">The distance in meters</param>
Polar(float angle, float distance);
Polar(Vector2 v);
/// <summary>
/// A polar vector with zero degrees and distance
/// </summary>
@ -51,14 +55,14 @@ struct Polar {
/// </summary>
/// <param name="v">The vector to subtract from this vector</param>
/// <returns>The result of the subtraction</returns>
Polar operator-(const Polar& v) const;
Polar operator-(const Polar &v) const;
/// <summary>
/// Add another polar vector to this polar vector
/// </summary>
/// <param name="v">The vector to add</param>
/// <returns>The result of adding the vector</returns>
Polar operator+(const Polar& v) const;
Polar operator+(const Polar &v) const;
/// <summary>
/// Scale the vector uniformly up
@ -76,7 +80,7 @@ struct Polar {
/// <returns>The scaled vector</returns>
/// This operation will scale the distance of the vector. The angle will be
/// unaffected.
Polar operator/(const float& factor);
Polar operator/(const float &factor);
/// <summary>
/// The distance between two vectors
@ -84,7 +88,7 @@ struct Polar {
/// <param name="v1">The first vector</param>
/// <param name="v2">The second vector</param>
/// <returns>The distance between the two vectors</returns>
static float Distance(const Polar& v1, const Polar& v2);
static float Distance(const Polar &v1, const Polar &v2);
/// <summary>
/// Rotate the vector
@ -95,4 +99,6 @@ struct Polar {
static Polar Rotate(Polar v, float angle);
};
#include "Vector2.h"
#endif

View File

@ -116,7 +116,7 @@ float Vector2::SignedAngle(Vector2 from, Vector2 to) {
float angleFrom = atan2(from.y, from.x);
float angleTo = atan2(to.y, to.x);
return (angleTo - angleFrom) * Angle::Rad2Deg;
return -(angleTo - angleFrom) * Angle::Rad2Deg;
}
Vector2 Vector2::Rotate(Vector2 v, float angle) {

29
test/Polar_test.cc Normal file
View File

@ -0,0 +1,29 @@
#if GTEST
#include <gtest/gtest.h>
#include <limits>
#include <math.h>
#include "Polar.h"
#define FLOAT_INFINITY std::numeric_limits<float>::infinity()
TEST(Polar, FromVector2) {
Vector2 v = Vector2(0, 1);
Polar p = Polar::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";
v = Vector2(1, 0);
p = Polar::Polar(v);
EXPECT_FLOAT_EQ(p.distance, 1.0F) << "p.distance 1 0";
EXPECT_FLOAT_EQ(p.angle, 90.0F) << "s.angle 1 0";
v = Vector2(-1, 1);
p = Polar::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";
}
#endif

View File

@ -399,11 +399,11 @@ TEST(Vector2, SignedAngle) {
bool r = false;
f = Vector2::SignedAngle(v1, v2);
EXPECT_FLOAT_EQ(f, 12.09476F) << "SignedAngle(4 5, 1 2)";
EXPECT_FLOAT_EQ(f, -12.09476F) << "SignedAngle(4 5, 1 2)";
v2 = Vector2(-1, -2);
f = Vector2::SignedAngle(v1, v2);
EXPECT_FLOAT_EQ(f, -167.9052F) << "SignedAngle(4 5, -1 -2)";
EXPECT_FLOAT_EQ(f, 167.9052F) << "SignedAngle(4 5, -1 -2)";
v2 = Vector2(0, 0);
f = Vector2::SignedAngle(v1, v2);
@ -420,6 +420,16 @@ TEST(Vector2, SignedAngle) {
r = isnan(f);
EXPECT_TRUE(r) << "SignedAngle(4 5, -INFINITY -INFINITY)";
}
v1 = Vector2(0, 1);
v2 = Vector2(1, 0);
f = Vector2::SignedAngle(v1, v2);
EXPECT_FLOAT_EQ(f, 90.0F) << "SignedAngle(0 1, 1 0)";
v1 = Vector2(0, 1);
v2 = Vector2(0, -1);
f = Vector2::SignedAngle(v1, v2);
EXPECT_FLOAT_EQ(f, 180.0F) << "SignedAngle(0 1, 1 0)";
}
TEST(Vector2, Rotate) {