mirror of
https://github.com/thunderbrewhq/typhoon.git
synced 2025-12-12 02:22:30 +00:00
feat(matrix): add C44Matrix::Adjoint
This commit is contained in:
parent
41f85dc8b7
commit
7da043cd47
4 changed files with 92 additions and 0 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
file(GLOB TEMPEST_SOURCES
|
file(GLOB TEMPEST_SOURCES
|
||||||
"*.cpp"
|
"*.cpp"
|
||||||
|
"matrix/*.cpp"
|
||||||
"vector/*.cpp"
|
"vector/*.cpp"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
25
tempest/matrix/C44Matrix.cpp
Normal file
25
tempest/matrix/C44Matrix.cpp
Normal file
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
@ -40,6 +40,7 @@ class C44Matrix {
|
||||||
, d1(d1)
|
, d1(d1)
|
||||||
, d2(d2)
|
, d2(d2)
|
||||||
, d3(d3) {};
|
, d3(d3) {};
|
||||||
|
C44Matrix Adjoint() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -42,3 +42,68 @@ TEST_CASE("C44Matrix", "[matrix]") {
|
||||||
REQUIRE(matrix.d3 == 16.0f);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue