PeriDyno 1.0.0
Loading...
Searching...
No Matches
Matrix4x4.inl
Go to the documentation of this file.
1#include <cmath>
2#include <limits>
3
4#include "Vector.h"
5
6namespace dyno {
7
8 template <typename T>
10 :SquareMatrix(0) //delegating ctor
11 {
12 }
13
14 template <typename T>
16 : SquareMatrix(value, value, value, value,
17 value, value, value, value,
18 value, value, value, value,
19 value, value, value, value) //delegating ctor
20 {
21 }
22
23 template <typename T>
24 DYN_FUNC SquareMatrix<T, 4>::SquareMatrix(T x00, T x01, T x02, T x03, T x10, T x11, T x12, T x13, T x20, T x21, T x22, T x23, T x30, T x31, T x32, T x33)
25 :data_(x00, x10, x20, x30,
26 x01, x11, x21, x31,
27 x02, x12, x22, x32,
28 x03, x13, x23, x33)
29 {
30 }
31
32 template <typename T>
33 DYN_FUNC SquareMatrix<T, 4>::SquareMatrix(const Vector<T, 4> &row1, const Vector<T, 4> &row2, const Vector<T, 4> &row3, const Vector<T, 4> &row4)
34 :data_(row1[0], row2[0], row3[0], row4[0],
35 row1[1], row2[1], row3[1], row4[1],
36 row1[2], row2[2], row3[2], row4[2],
37 row1[3], row2[3], row3[3], row4[3])
38 {
39 }
40
41 template <typename T>
43 {
44 (*this)(0, 0) = mat(0, 0); (*this)(0, 1) = mat(0, 1); (*this)(0, 2) = mat(0, 2); (*this)(0, 3) = mat(0, 3);
45 (*this)(1, 0) = mat(1, 0); (*this)(1, 1) = mat(1, 1); (*this)(1, 2) = mat(1, 2); (*this)(1, 3) = mat(1, 3);
46 (*this)(2, 0) = mat(2, 0); (*this)(2, 1) = mat(2, 1); (*this)(2, 2) = mat(2, 2); (*this)(2, 3) = mat(2, 3);
47 (*this)(3, 0) = mat(3, 0); (*this)(3, 1) = mat(3, 1); (*this)(3, 2) = mat(3, 2); (*this)(3, 3) = mat(3, 3);
48 }
49
50 template <typename T>
52 {
53
54 }
55
56 template <typename T>
57 DYN_FUNC T& SquareMatrix<T, 4>::operator() (unsigned int i, unsigned int j)
58 {
59 return const_cast<T &>(static_cast<const SquareMatrix<T, 4> &>(*this)(i, j));
60 }
61
62 template <typename T>
63 DYN_FUNC const T& SquareMatrix<T, 4>::operator() (unsigned int i, unsigned int j) const
64 {
65 return data_[j][i];
66 }
67
68 template <typename T>
69 DYN_FUNC const Vector<T, 4> SquareMatrix<T, 4>::row(unsigned int i) const
70 {
71 Vector<T, 4> result((*this)(i, 0), (*this)(i, 1), (*this)(i, 2), (*this)(i, 3));
72 return result;
73 }
74
75 template <typename T>
76 DYN_FUNC const Vector<T, 4> SquareMatrix<T, 4>::col(unsigned int i) const
77 {
78 Vector<T, 4> result((*this)(0, i), (*this)(1, i), (*this)(2, i), (*this)(3, i));
79 return result;
80 }
81
82 template <typename T>
83 DYN_FUNC void SquareMatrix<T, 4>::setRow(unsigned int i, const Vector<T, 4>& vec)
84 {
85 data_[0][i] = vec[0];
86 data_[1][i] = vec[1];
87 data_[2][i] = vec[2];
88 data_[3][i] = vec[3];
89 }
90
91 template <typename T>
92 DYN_FUNC void SquareMatrix<T, 4>::setCol(unsigned int j, const Vector<T, 4>& vec)
93 {
94 data_[j][0] = vec[0];
95 data_[j][1] = vec[1];
96 data_[j][2] = vec[2];
97 data_[j][3] = vec[3];
98 }
99
100 template <typename T>
102 {
103 return SquareMatrix<T, 4>(*this) += mat2;
104 }
105
106 template <typename T>
108 {
109 data_ += mat2.data_;
110 return *this;
111 }
112
113 template <typename T>
115 {
116 return SquareMatrix<T, 4>(*this) -= mat2;
117 }
118
119 template <typename T>
121 {
122 data_ -= mat2.data_;
123 return *this;
124 }
125
126
127 template <typename T>
129 {
130 data_ = mat2.data_;
131 return *this;
132 }
133
134
135 template <typename T>
137 {
138 return data_ == mat2.data_;
139 }
140
141 template <typename T>
143 {
144 return !((*this) == mat2);
145 }
146
147 template <typename T>
148 DYN_FUNC const SquareMatrix<T, 4> SquareMatrix<T, 4>::operator* (const T& scale) const
149 {
150 return SquareMatrix<T, 4>(*this) *= scale;
151 }
152
153 template <typename T>
155 {
156 data_ *= scale;
157 return *this;
158 }
159
160 template <typename T>
162 {
163 Vector<T, 4> result(0);
164 for (unsigned int i = 0; i < 4; ++i)
165 for (unsigned int j = 0; j < 4; ++j)
166 result[i] += (*this)(i, j)*vec[j];
167 return result;
168 }
169
170 template <typename T>
172 {
173 return SquareMatrix<T, 4>(*this) *= mat2;
174 }
175
176 template <typename T>
178 {
179 data_ *= mat2.data_;
180 return *this;
181 }
182
183 template <typename T>
185 {
186 return SquareMatrix<T, 4>(*this) *= mat2.inverse();
187 }
188
189 template <typename T>
191 {
192 data_ *= glm::inverse(mat2.data_);
193 return *this;
194 }
195
196 template <typename T>
197 DYN_FUNC const SquareMatrix<T, 4> SquareMatrix<T, 4>::operator/ (const T& scale) const
198 {
199 return SquareMatrix<T, 4>(*this) /= scale;
200 }
201
202 template <typename T>
204 {
205 data_ /= scale;
206 return *this;
207 }
208
209 template <typename T>
211 {
213 res.data_ = -data_;
214 return res;
215 }
216
217 template <typename T>
219 {
221 res.data_ = glm::transpose(data_);
222 return res;
223 }
224
225 template <typename T>
227 {
229 res.data_ = glm::inverse(data_);
230
231 return res;
232 }
233
234 template <typename T>
236 {
237 return glm::determinant(data_);
238 }
239
240 template <typename T>
242 {
243 return (*this)(0, 0) + (*this)(1, 1) + (*this)(2, 2) + (*this)(3, 3);
244 }
245
246 template <typename T>
248 {
249 T result = 0;
250 for (unsigned int i = 0; i < 4; ++i)
251 for (unsigned int j = 0; j < 4; ++j)
252 result += (*this)(i, j)*mat2(i, j);
253 return result;
254 }
255
256 template <typename T>
258 {
259 T result = 0;
260 for (unsigned int i = 0; i < 4; ++i)
261 for (unsigned int j = 0; j < 4; ++j)
262 result += (*this)(i, j)*(*this)(i, j);
263 return glm::sqrt(result);
264 }
265
266 template <typename T>
268 {
269 const SquareMatrix<T, 4>& A = (*this);
270 const T sum1 = fabs(A(0, 0)) + fabs(A(1, 0)) + fabs(A(2, 0)) + fabs(A(3, 0));
271 const T sum2 = fabs(A(0, 1)) + fabs(A(1, 1)) + fabs(A(2, 1)) + fabs(A(3, 1));
272 const T sum3 = fabs(A(0, 2)) + fabs(A(1, 2)) + fabs(A(2, 2)) + fabs(A(3, 2));
273 const T sum4 = fabs(A(0, 3)) + fabs(A(1, 3)) + fabs(A(2, 3)) + fabs(A(3, 3));
274 T maxSum = sum1;
275 if (sum2 > maxSum)
276 maxSum = sum2;
277 if (sum3 > maxSum)
278 maxSum = sum3;
279 if (sum4 > maxSum)
280 maxSum = sum4;
281 return maxSum;
282 }
283
284 template <typename T>
286 {
287 const SquareMatrix<T, 4>& A = (*this);
288 const T sum1 = fabs(A(0, 0)) + fabs(A(0, 1)) + fabs(A(0, 2)) + fabs(A(0, 3));
289 const T sum2 = fabs(A(1, 0)) + fabs(A(1, 1)) + fabs(A(1, 2)) + fabs(A(1, 3));
290 const T sum3 = fabs(A(2, 0)) + fabs(A(2, 1)) + fabs(A(2, 2)) + fabs(A(2, 3));
291 const T sum4 = fabs(A(3, 0)) + fabs(A(3, 1)) + fabs(A(3, 2)) + fabs(A(3, 3));
292 T maxSum = sum1;
293 if (sum2 > maxSum)
294 maxSum = sum2;
295 if (sum3 > maxSum)
296 maxSum = sum3;
297 if (sum4 > maxSum)
298 maxSum = sum4;
299 return maxSum;
300 }
301
302 template <typename T>
304 {
305 return SquareMatrix<T, 4>(1.0, 0.0, 0.0, 0.0,
306 0.0, 1.0, 0.0, 0.0,
307 0.0, 0.0, 1.0, 0.0,
308 0.0, 0.0, 0.0, 1.0);
309 }
310
311 template <typename S, typename T>
312 DYN_FUNC const SquareMatrix<T, 4> operator* (S scale, const SquareMatrix<T, 4> &mat)
313 {
314 return mat * scale;
315 }
316
317} //end of namespace dyno
glm::tmat4x4< T > data_
Definition Matrix4x4.h:79
#define T(t)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
DYN_FUNC const Complex< T > operator*(S scale, const Complex< T > &complex)
Definition Complex.inl:247