From 7da043cd47b328b7ca9e110c96d9102258163df9 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Sun, 29 Nov 2020 13:19:28 -0600 Subject: [PATCH] feat(matrix): add C44Matrix::Adjoint --- tempest/CMakeLists.txt | 1 + tempest/matrix/C44Matrix.cpp | 25 ++++++++++++++ tempest/matrix/C44Matrix.hpp | 1 + test/Matrix.cpp | 65 ++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 tempest/matrix/C44Matrix.cpp diff --git a/tempest/CMakeLists.txt b/tempest/CMakeLists.txt index 75edd83..21d6ff1 100644 --- a/tempest/CMakeLists.txt +++ b/tempest/CMakeLists.txt @@ -1,5 +1,6 @@ file(GLOB TEMPEST_SOURCES "*.cpp" + "matrix/*.cpp" "vector/*.cpp" ) diff --git a/tempest/matrix/C44Matrix.cpp b/tempest/matrix/C44Matrix.cpp new file mode 100644 index 0000000..c744422 --- /dev/null +++ b/tempest/matrix/C44Matrix.cpp @@ -0,0 +1,25 @@ +#include "tempest/matrix/C44Matrix.hpp" + +C44Matrix C44Matrix::Adjoint() const { + float a0 = this->b2 * this->c3 * this->d1 + this->b3 * this->c1 * this->d2 + this->b1 * this->c2 * this->d3 - this->b3 * this->c2 * this->d1 - this->b2 * this->c1 * this->d3 - this->b1 * this->c3 * this->d2; + float a1 = -(this->a2 * this->c3 * this->d1 + this->a3 * this->c1 * this->d2 + this->a1 * this->c2 * this->d3 - this->a3 * this->c2 * this->d1 - this->a2 * this->c1 * this->d3 - this->a1 * this->c3 * this->d2); + float a2 = this->a1 * this->b2 * this->d3 + this->a2 * this->b3 * this->d1 + this->a3 * this->b1 * this->d2 - this->a3 * this->b2 * this->d1 - this->a2 * this->b1 * this->d3 - this->a1 * this->b3 * this->d2; + float a3 = -(this->a2 * this->b3 * this->c1 + this->a3 * this->b1 * this->c2 + this->a1 * this->b2 * this->c3 - this->a3 * this->b2 * this->c1 - this->a2 * this->b1 * this->c3 - this->a1 * this->b3 * this->c2); + + float b0 = -(this->b3 * this->c0 * this->d2 + this->b0 * this->c2 * this->d3 + this->b2 * this->c3 * this->d0 - this->b3 * this->c2 * this->d0 - this->b2 * this->c0 * this->d3 - this->b0 * this->c3 * this->d2); + float b1 = this->a2 * this->c3 * this->d0 + this->a3 * this->c0 * this->d2 + this->a0 * this->c2 * this->d3 - this->a3 * this->c2 * this->d0 - this->a2 * this->c0 * this->d3 - this->a0 * this->c3 * this->d2; + float b2 = -(this->a2 * this->b3 * this->d0 + this->a3 * this->b0 * this->d2 + this->a0 * this->b2 * this->d3 - this->a3 * this->b2 * this->d0 - this->a2 * this->b0 * this->d3 - this->a0 * this->b3 * this->d2); + float b3 = this->a2 * this->b3 * this->c0 + this->a3 * this->b0 * this->c2 + this->a0 * this->b2 * this->c3 - this->a3 * this->b2 * this->c0 - this->a2 * this->b0 * this->c3 - this->a0 * this->b3 * this->c2; + + float c0 = this->b1 * this->c3 * this->d0 + this->b3 * this->c0 * this->d1 + this->b0 * this->c1 * this->d3 - this->b3 * this->c1 * this->d0 - this->b1 * this->c0 * this->d3 - this->b0 * this->c3 * this->d1; + float c1 = -(this->a1 * this->c3 * this->d0 + this->a3 * this->c0 * this->d1 + this->a0 * this->c1 * this->d3 - this->a3 * this->c1 * this->d0 - this->a1 * this->c0 * this->d3 - this->a0 * this->c3 * this->d1); + float c2 = this->a1 * this->b3 * this->d0 + this->a3 * this->b0 * this->d1 + this->a0 * this->b1 * this->d3 - this->a3 * this->b1 * this->d0 - this->a1 * this->b0 * this->d3 - this->a0 * this->b3 * this->d1; + float c3 = -(this->a1 * this->b3 * this->c0 + this->a3 * this->b0 * this->c1 + this->a0 * this->b1 * this->c3 - this->a3 * this->b1 * this->c0 - this->a1 * this->b0 * this->c3 - this->a0 * this->b3 * this->c1); + + float d0 = -(this->b2 * this->c0 * this->d1 + this->b0 * this->c1 * this->d2 + this->b1 * this->c2 * this->d0 - this->b2 * this->c1 * this->d0 - this->b1 * this->c0 * this->d2 - this->b0 * this->c2 * this->d1); + float d1 = this->a1 * this->c2 * this->d0 + this->a2 * this->c0 * this->d1 + this->a0 * this->c1 * this->d2 - this->a2 * this->c1 * this->d0 - this->a1 * this->c0 * this->d2 - this->a0 * this->c2 * this->d1; + float d2 = -(this->a1 * this->b2 * this->d0 + this->a2 * this->b0 * this->d1 + this->a0 * this->b1 * this->d2 - this->a2 * this->b1 * this->d0 - this->a1 * this->b0 * this->d2 - this->a0 * this->b2 * this->d1); + float d3 = this->a0 * this->b1 * this->c2 + this->a1 * this->b2 * this->c0 + this->a2 * this->b0 * this->c1 - this->b1 * this->a2 * this->c0 - this->c2 * this->b0 * this->a1 - this->a0 * this->b2 * this->c1; + + return C44Matrix(a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, d0, d1, d2, d3); +} diff --git a/tempest/matrix/C44Matrix.hpp b/tempest/matrix/C44Matrix.hpp index 987f2b7..268061b 100644 --- a/tempest/matrix/C44Matrix.hpp +++ b/tempest/matrix/C44Matrix.hpp @@ -40,6 +40,7 @@ class C44Matrix { , d1(d1) , d2(d2) , d3(d3) {}; + C44Matrix Adjoint() const; }; #endif diff --git a/test/Matrix.cpp b/test/Matrix.cpp index 7fe4736..b229bad 100644 --- a/test/Matrix.cpp +++ b/test/Matrix.cpp @@ -42,3 +42,68 @@ TEST_CASE("C44Matrix", "[matrix]") { REQUIRE(matrix.d3 == 16.0f); } } + +TEST_CASE("C44Matrix::Adjoint", "[matrix]") { + SECTION("returns adjoint of identity matrix") { + C44Matrix matrix; + auto adjoint = matrix.Adjoint(); + CHECK(adjoint.a0 == 1.0f); + CHECK(adjoint.a1 == 0.0f); + CHECK(adjoint.a2 == 0.0f); + CHECK(adjoint.a3 == 0.0f); + CHECK(adjoint.b0 == 0.0f); + CHECK(adjoint.b1 == 1.0f); + CHECK(adjoint.b2 == 0.0f); + CHECK(adjoint.b3 == 0.0f); + CHECK(adjoint.c0 == 0.0f); + CHECK(adjoint.c1 == 0.0f); + CHECK(adjoint.c2 == 1.0f); + CHECK(adjoint.c3 == 0.0f); + CHECK(adjoint.d0 == 0.0f); + CHECK(adjoint.d1 == 0.0f); + CHECK(adjoint.d2 == 0.0f); + CHECK(adjoint.d3 == 1.0f); + } + + SECTION("returns adjoint of non-identity matrix") { + auto matrix = C44Matrix(-1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f); + auto adjoint = matrix.Adjoint(); + CHECK(adjoint.a0 == 0.0f); + CHECK(adjoint.a1 == 0.0f); + CHECK(adjoint.a2 == 0.0f); + CHECK(adjoint.a3 == 0.0f); + CHECK(adjoint.b0 == 0.0f); + CHECK(adjoint.b1 == 8.0f); + CHECK(adjoint.b2 == -16.0f); + CHECK(adjoint.b3 == 8.0f); + CHECK(adjoint.c0 == 0.0f); + CHECK(adjoint.c1 == -16.0f); + CHECK(adjoint.c2 == 32.0f); + CHECK(adjoint.c3 == -16.0f); + CHECK(adjoint.d0 == 0.0f); + CHECK(adjoint.d1 == 8.0f); + CHECK(adjoint.d2 == -16.0f); + CHECK(adjoint.d3 == 8.0f); + } + + SECTION("does not modify self") { + auto matrix = C44Matrix(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f); + auto adjoint = matrix.Adjoint(); + CHECK(matrix.a0 == 1.0f); + CHECK(matrix.a1 == 2.0f); + CHECK(matrix.a2 == 3.0f); + CHECK(matrix.a3 == 4.0f); + CHECK(matrix.b0 == 5.0f); + CHECK(matrix.b1 == 6.0f); + CHECK(matrix.b2 == 7.0f); + CHECK(matrix.b3 == 8.0f); + CHECK(matrix.c0 == 9.0f); + CHECK(matrix.c1 == 10.0f); + CHECK(matrix.c2 == 11.0f); + CHECK(matrix.c3 == 12.0f); + CHECK(matrix.d0 == 13.0f); + CHECK(matrix.d1 == 14.0f); + CHECK(matrix.d2 == 15.0f); + CHECK(matrix.d3 == 16.0f); + } +}