From ed2e6cd95af41d781fbb96f5d2b92b99895ef25e Mon Sep 17 00:00:00 2001 From: Guillaume Bittoun Date: Tue, 3 Mar 2015 15:57:04 +0000 Subject: [PATCH] matrix: using vec_t for permutation logic --- src/lol/math/matrix.h | 34 +++++++++++++++++++++++++--------- src/t/math/matrix.cpp | 16 ++++++++-------- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/lol/math/matrix.h b/src/lol/math/matrix.h index 75b11a38..20ad6102 100644 --- a/src/lol/math/matrix.h +++ b/src/lol/math/matrix.h @@ -571,19 +571,19 @@ T const & determinant(mat_t const &m) } /* - * Compute permutation matrix + * Compute permutation vector of a square matrix */ template -mat_t p_matrix(mat_t const & m) +vec_t p_vector(mat_t const & m) { - int used[N]; - int order[N]; + vec_t used; + vec_t permutation; for (int i = 0 ; i < N ; ++i) { used[i] = 0; - order[i] = -1; + permutation[i] = -1; } for (int i = 0 ; i < N ; ++i) @@ -599,15 +599,31 @@ mat_t p_matrix(mat_t const & m) ASSERT(index_max != -1); ASSERT(index_max < N); - order[i] = index_max; + permutation[i] = index_max; used[index_max] = 1; } - mat_t P; + return permutation; +} + +/* + * Compute the permutation of a square matrix according to the permutation vector + */ + +template +mat_t permute(mat_t const & m, vec_t const & permutation) +{ + mat_t result; + for (int i = 0 ; i < N ; ++i) - P[order[i]][i] = 1.0f; + { + for (int j = 0 ; j < N ; ++j) + { + result[i][j] = m[i][permutation[j]]; + } + } - return P; + return result; } /* diff --git a/src/t/math/matrix.cpp b/src/t/math/matrix.cpp index efa498b8..3f01a8db 100644 --- a/src/t/math/matrix.cpp +++ b/src/t/math/matrix.cpp @@ -102,17 +102,17 @@ lolunit_declare_fixture(MatrixTest) vec4(0, 0, 0, 1), vec4(0, 0, 1, 0)); - mat4 P1 = p_matrix(m1); - P1 = P1 * m1; + vec_t perm1 = p_vector(m1); + m1 = permute(m1, perm1); for (int i = 0 ; i < 4 ; ++i) { for (int j = 0 ; j < 4 ; ++j) { if (i == j) - lolunit_assert_equal(P1[i][j], 1); + lolunit_assert_equal(m1[i][j], 1); else - lolunit_assert_equal(P1[i][j], 0); + lolunit_assert_equal(m1[i][j], 0); } } @@ -121,17 +121,17 @@ lolunit_declare_fixture(MatrixTest) vec4(0, 0, 0, 1), vec4(1, 0, 0, 0)); - mat4 P2 = p_matrix(m2); - P2 = P2 * m2; + vec_t perm2 = p_vector(m2); + m2 = permute(m2, perm2); for (int i = 0 ; i < 4 ; ++i) { for (int j = 0 ; j < 4 ; ++j) { if (i == j) - lolunit_assert_equal(P2[i][j], 1); + lolunit_assert_equal(m2[i][j], 1); else - lolunit_assert_equal(P2[i][j], 0); + lolunit_assert_equal(m2[i][j], 0); } } }