source: GTP/trunk/Lib/Geom/shared/GTGeometry/src/libs/gfx/math/Mat4.cxx @ 1025

Revision 1025, 4.3 KB checked in by gumbau, 18 years ago (diff)

namespace simplif

Line 
1#include <gfx/std.h>
2#include <gfx/math/Mat4.h>
3
4using namespace simplif;
5
6Mat4 Mat4::identity(Vec4(1,0,0,0),Vec4(0,1,0,0),Vec4(0,0,1,0),Vec4(0,0,0,1));
7Mat4 Mat4::zero(Vec4(0,0,0,0),Vec4(0,0,0,0),Vec4(0,0,0,0),Vec4(0,0,0,0));
8Mat4 Mat4::unit(Vec4(1,1,1,1),Vec4(1,1,1,1),Vec4(1,1,1,1),Vec4(1,1,1,1));
9
10Mat4 Mat4::trans(real x, real y, real z)
11{
12    return Mat4(Vec4(1,0,0,x),
13                Vec4(0,1,0,y),
14                Vec4(0,0,1,z),
15                Vec4(0,0,0,1));
16}
17
18Mat4 Mat4::scale(real x, real y, real z)
19{
20    return Mat4(Vec4(x,0,0,0),
21                Vec4(0,y,0,0),
22                Vec4(0,0,z,0),
23                Vec4(0,0,0,1));
24}
25
26Mat4 Mat4::xrot(real a)
27{
28    real c = cos(a);
29    real s = sin(a);
30
31    return Mat4(Vec4(1, 0, 0, 0),
32                Vec4(0, c,-s, 0),
33                Vec4(0, s, c, 0),
34                Vec4(0, 0, 0, 1));
35}
36
37Mat4 Mat4::yrot(real a)
38{
39    real c = cos(a);
40    real s = sin(a);
41
42    return Mat4(Vec4(c, 0, s, 0),
43                Vec4(0, 1, 0, 0),
44                Vec4(-s,0, c, 0),
45                Vec4(0, 0, 0, 1));
46}
47
48Mat4 Mat4::zrot(real a)
49{
50    real c = cos(a);
51    real s = sin(a);
52
53    return Mat4(Vec4(c,-s, 0, 0),
54                Vec4(s, c, 0, 0),
55                Vec4(0, 0, 1, 0),
56                Vec4(0, 0, 0, 1));
57}
58
59Mat4 Mat4::operator*(const Mat4& m) const
60{
61    Mat4 A;
62    int i,j;
63
64    for(i=0;i<4;i++)
65        for(j=0;j<4;j++)
66            A(i,j) = row[i]*m.col(j);
67
68    return A;
69}
70
71real Mat4::det() const
72{
73    return row[0] * cross(row[1], row[2], row[3]);
74}
75
76Mat4 Mat4::transpose() const
77{
78    return Mat4(col(0), col(1), col(2), col(3));
79}
80
81Mat4 Mat4::adjoint() const
82{
83    Mat4 A;
84
85    A.row[0] = cross( row[1], row[2], row[3]);
86    A.row[1] = cross(-row[0], row[2], row[3]);
87    A.row[2] = cross( row[0], row[1], row[3]);
88    A.row[3] = cross(-row[0], row[1], row[2]);
89       
90    return A;
91}
92
93real Mat4::cramerInverse(Mat4& inv) const
94{
95    Mat4 A = adjoint();
96    real d = A.row[0] * row[0];
97
98    if( d==0.0 )
99        return 0.0;
100
101    inv = A.transpose() / d;
102    return d;
103}
104
105
106
107// Matrix inversion code for 4x4 matrices.
108// Originally ripped off and degeneralized from Paul's matrix library
109// for the view synthesis (Chen) software.
110//
111// Returns determinant of a, and b=a inverse.
112// If matrix is singular, returns 0 and leaves trash in b.
113//
114// Uses Gaussian elimination with partial pivoting.
115
116#define SWAP(a, b, t)   {t = a; a = b; b = t;}
117real Mat4::inverse(Mat4& B) const
118{
119    Mat4 A(*this);
120
121    int i, j, k;
122    real max, t, det, pivot;
123
124    /*---------- forward elimination ----------*/
125
126    for (i=0; i<4; i++)                 /* put identity matrix in B */
127        for (j=0; j<4; j++)
128            B(i, j) = (real)(i==j);
129
130    det = 1.0;
131    for (i=0; i<4; i++) {               /* eliminate in column i, below diag */
132        max = -1.;
133        for (k=i; k<4; k++)             /* find pivot for column i */
134            if (fabs(A(k, i)) > max) {
135                max = fabs(A(k, i));
136                j = k;
137            }
138        if (max<=0.) return 0.;         /* if no nonzero pivot, PUNT */
139        if (j!=i) {                     /* swap rows i and j */
140            for (k=i; k<4; k++)
141                SWAP(A(i, k), A(j, k), t);
142            for (k=0; k<4; k++)
143                SWAP(B(i, k), B(j, k), t);
144            det = -det;
145        }
146        pivot = A(i, i);
147        det *= pivot;
148        for (k=i+1; k<4; k++)           /* only do elems to right of pivot */
149            A(i, k) /= pivot;
150        for (k=0; k<4; k++)
151            B(i, k) /= pivot;
152        /* we know that A(i, i) will be set to 1, so don't bother to do it */
153
154        for (j=i+1; j<4; j++) {         /* eliminate in rows below i */
155            t = A(j, i);                /* we're gonna zero this guy */
156            for (k=i+1; k<4; k++)       /* subtract scaled row i from row j */
157                A(j, k) -= A(i, k)*t;   /* (ignore k<=i, we know they're 0) */
158            for (k=0; k<4; k++)
159                B(j, k) -= B(i, k)*t;
160        }
161    }
162
163    /*---------- backward elimination ----------*/
164
165    for (i=4-1; i>0; i--) {             /* eliminate in column i, above diag */
166        for (j=0; j<i; j++) {           /* eliminate in rows above i */
167            t = A(j, i);                /* we're gonna zero this guy */
168            for (k=0; k<4; k++)         /* subtract scaled row i from row j */
169                B(j, k) -= B(i, k)*t;
170        }
171    }
172
173    return det;
174}
Note: See TracBrowser for help on using the repository browser.