Changeset 3854


Ignore:
Timestamp:
Mar 3, 2015, 4:57:04 PM (7 years ago)
Author:
guite
Message:

matrix: using vec_t for permutation logic

Location:
trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lol/math/matrix.h

    r3853 r3854  
    572572
    573573/*
    574  * Compute permutation matrix
    575  */
    576 
    577 template<typename T, int N>
    578 mat_t<T, N, N> p_matrix(mat_t<T, N, N> const & m)
    579 {
    580     int used[N];
    581     int order[N];
     574 * Compute permutation vector of a square matrix
     575 */
     576
     577template<typename T, int N>
     578vec_t<int, N> p_vector(mat_t<T, N, N> const & m)
     579{
     580    vec_t<int, N> used;
     581    vec_t<int, N> permutation;
    582582
    583583    for (int i = 0 ; i < N ; ++i)
    584584    {
    585585        used[i] = 0;
    586         order[i] = -1;
     586        permutation[i] = -1;
    587587    }
    588588
     
    600600        ASSERT(index_max < N);
    601601
    602         order[i] = index_max;
     602        permutation[i] = index_max;
    603603        used[index_max] = 1;
    604604    }
    605605
    606     mat_t<T, N, N> P;
     606    return permutation;
     607}
     608
     609/*
     610 * Compute the permutation of a square matrix according to the permutation vector
     611 */
     612
     613template<typename T, int N>
     614mat_t<T, N, N> permute(mat_t<T, N, N> const & m, vec_t<int, N> const & permutation)
     615{
     616    mat_t<T, N, N> result;
     617
    607618    for (int i = 0 ; i < N ; ++i)
    608         P[order[i]][i] = 1.0f;
    609 
    610     return P;
     619    {
     620        for (int j = 0 ; j < N ; ++j)
     621        {
     622            result[i][j] = m[i][permutation[j]];
     623        }
     624    }
     625
     626    return result;
    611627}
    612628
  • trunk/src/t/math/matrix.cpp

    r3852 r3854  
    103103               vec4(0,  0,  1,  0));
    104104
    105         mat4 P1 = p_matrix(m1);
    106         P1 = P1 * m1;
     105        vec_t<int, 4> perm1 = p_vector(m1);
     106        m1 = permute(m1, perm1);
    107107
    108108        for (int i = 0 ; i < 4 ; ++i)
     
    111111            {
    112112                if (i == j)
    113                     lolunit_assert_equal(P1[i][j], 1);
     113                    lolunit_assert_equal(m1[i][j], 1);
    114114                else
    115                     lolunit_assert_equal(P1[i][j], 0);
     115                    lolunit_assert_equal(m1[i][j], 0);
    116116            }
    117117        }
     
    122122               vec4(1,  0,  0,  0));
    123123
    124         mat4 P2 = p_matrix(m2);
    125         P2 = P2 * m2;
     124        vec_t<int, 4> perm2 = p_vector(m2);
     125        m2 = permute(m2, perm2);
    126126
    127127        for (int i = 0 ; i < 4 ; ++i)
     
    130130            {
    131131                if (i == j)
    132                     lolunit_assert_equal(P2[i][j], 1);
     132                    lolunit_assert_equal(m2[i][j], 1);
    133133                else
    134                     lolunit_assert_equal(P2[i][j], 0);
     134                    lolunit_assert_equal(m2[i][j], 0);
    135135            }
    136136        }
Note: See TracChangeset for help on using the changeset viewer.