diff --git a/tempest/vector/C3Vector.cpp b/tempest/vector/C3Vector.cpp index df3054e..fb4dd33 100644 --- a/tempest/vector/C3Vector.cpp +++ b/tempest/vector/C3Vector.cpp @@ -13,6 +13,10 @@ float C3Vector::Mag() const { return CMath::sqrt(this->SquaredMag()); } +void C3Vector::Normalize() { + this->operator*=(1.0f / this->Mag()); +} + float C3Vector::SquaredMag() const { return this->x * this->x + this->y * this->y + this->z * this->z; } diff --git a/tempest/vector/C3Vector.hpp b/tempest/vector/C3Vector.hpp index 7531a9b..2ae6c8d 100644 --- a/tempest/vector/C3Vector.hpp +++ b/tempest/vector/C3Vector.hpp @@ -16,6 +16,7 @@ class C3Vector { , z(z) {}; C3Vector& operator*=(float a); float Mag() const; + void Normalize(); float SquaredMag() const; }; diff --git a/test/Vector.cpp b/test/Vector.cpp index 18ad882..40c537e 100644 --- a/test/Vector.cpp +++ b/test/Vector.cpp @@ -60,6 +60,24 @@ TEST_CASE("C3Vector::Mag", "[vector]") { } } +TEST_CASE("C3Vector::Normalize", "[vector]") { + SECTION("normalizes C3Vector(1.0f, 1.0f, 1.0f)") { + auto vector = C3Vector(1.0f, 1.0f, 1.0f); + vector.Normalize(); + REQUIRE(vector.x == Approx(0.57735f)); + REQUIRE(vector.y == Approx(0.57735f)); + REQUIRE(vector.z == Approx(0.57735f)); + } + + SECTION("normalizes C3Vector(4.0f, 16.0f, 32.0f)") { + auto vector = C3Vector(4.0f, 16.0f, 32.0f); + vector.Normalize(); + REQUIRE(vector.x == Approx(0.11111f)); + REQUIRE(vector.y == Approx(0.44444f)); + REQUIRE(vector.z == Approx(0.88888f)); + } +} + TEST_CASE("C3Vector::SquaredMag", "[vector]") { SECTION("calculates squared mag") { auto vector = C3Vector(1.0f, 2.0f, 3.0f);