PeriDyno 1.0.0
Loading...
Searching...
No Matches
Matrix3x3.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, value, value, value, value, value) //delegating ctor
17 {
18 }
19
20 template <typename T>
21 DYN_FUNC SquareMatrix<T, 3>::SquareMatrix(T x00, T x01, T x02, T x10, T x11, T x12, T x20, T x21, T x22)
22 {
23 data_[0] = Vector<T, 3>(x00, x10, x20);
24 data_[1] = Vector<T, 3>(x01, x11, x21);
25 data_[2] = Vector<T, 3>(x02, x12, x22);
26 }
27
28 template <typename T>
29 DYN_FUNC SquareMatrix<T, 3>::SquareMatrix(const Vector<T, 3> &row1, const Vector<T, 3> &row2, const Vector<T, 3> &row3)
30 {
31 data_[0] = Vector<T, 3>(row1[0], row2[0], row3[0]);
32 data_[1] = Vector<T, 3>(row1[1], row2[1], row3[1]);
33 data_[2] = Vector<T, 3>(row1[2], row2[2], row3[2]);
34 }
35
36 template <typename T>
38 {
39 data_[0] = mat.data_[0];
40 data_[1] = mat.data_[1];
41 data_[2] = mat.data_[2];
42 }
43
44 template <typename T>
46 {
47
48 }
49
50 template <typename T>
51 DYN_FUNC T& SquareMatrix<T, 3>::operator() (unsigned int i, unsigned int j)
52 {
53 return const_cast<T &>(static_cast<const SquareMatrix<T, 3> &>(*this)(i, j));
54 }
55
56 template <typename T>
57 DYN_FUNC const T& SquareMatrix<T, 3>::operator() (unsigned int i, unsigned int j) const
58 {
59 return data_[j][i];
60 }
61
62 template <typename T>
63 DYN_FUNC const Vector<T, 3> SquareMatrix<T, 3>::row(unsigned int i) const
64 {
65 Vector<T, 3> result((*this)(i, 0), (*this)(i, 1), (*this)(i, 2));
66 return result;
67 }
68
69 template <typename T>
70 DYN_FUNC const Vector<T, 3> SquareMatrix<T, 3>::col(unsigned int i) const
71 {
72 Vector<T, 3> result((*this)(0, i), (*this)(1, i), (*this)(2, i));
73 return result;
74 }
75
76 template <typename T>
77 DYN_FUNC void SquareMatrix<T, 3>::setRow(unsigned int i, const Vector<T, 3>& vec)
78 {
79 data_[0][i] = vec[0];
80 data_[1][i] = vec[1];
81 data_[2][i] = vec[2];
82 }
83
84 template <typename T>
85 DYN_FUNC void SquareMatrix<T, 3>::setCol(unsigned int j, const Vector<T, 3>& vec)
86 {
87 data_[j][0] = vec[0];
88 data_[j][1] = vec[1];
89 data_[j][2] = vec[2];
90 }
91
92 template <typename T>
94 {
95 return SquareMatrix<T, 3>(*this) += mat2;
96 }
97
98 template <typename T>
100 {
101 data_[0] += mat2.data_[0];
102 data_[1] += mat2.data_[1];
103 data_[2] += mat2.data_[2];
104 return *this;
105 }
106
107 template <typename T>
109 {
110 return SquareMatrix<T, 3>(*this) -= mat2;
111 }
112
113 template <typename T>
115 {
116 data_[0] -= mat2.data_[0];
117 data_[1] -= mat2.data_[1];
118 data_[2] -= mat2.data_[2];
119 return *this;
120 }
121
122 template <typename T>
124 {
125 data_[0] = mat2.data_[0];
126 data_[1] = mat2.data_[1];
127 data_[2] = mat2.data_[2];
128 return *this;
129 }
130
131 template <typename T>
133 {
134 return data_ == mat2.data_;
135 }
136
137 template <typename T>
139 {
140 return !((*this) == mat2);
141 }
142
143 template <typename T>
144 DYN_FUNC const SquareMatrix<T, 3> SquareMatrix<T, 3>::operator* (const T& scale) const
145 {
146 return SquareMatrix<T, 3>(*this) *= scale;
147 }
148
149 template <typename T>
151 {
152 data_[0] *= scale;
153 data_[1] *= scale;
154 data_[2] *= scale;
155 return *this;
156 }
157
158 template <typename T>
160 {
161 Vector<T, 3> result(0);
162 for (unsigned int i = 0; i < 3; ++i)
163 for (unsigned int j = 0; j < 3; ++j)
164 result[i] += (*this)(i, j)*vec[j];
165 return result;
166 }
167
168 template <typename T>
170 {
171 return SquareMatrix<T, 3>(*this) *= mat2;
172 }
173
174 template <typename T>
176 {
178 (*this)(0, 0) = t.data_[0].dot(mat2.data_[0]);
179 (*this)(0, 1) = t.data_[0].dot(mat2.data_[1]);
180 (*this)(0, 2) = t.data_[0].dot(mat2.data_[2]);
181 (*this)(1, 0) = t.data_[1].dot(mat2.data_[0]);
182 (*this)(1, 1) = t.data_[1].dot(mat2.data_[1]);
183 (*this)(1, 2) = t.data_[1].dot(mat2.data_[2]);
184 (*this)(2, 0) = t.data_[2].dot(mat2.data_[0]);
185 (*this)(2, 1) = t.data_[2].dot(mat2.data_[1]);
186 (*this)(2, 2) = t.data_[2].dot(mat2.data_[2]);
187
188 return *this;
189 }
190
191 template <typename T>
193 {
194 return SquareMatrix<T, 3>(*this) *= mat2.inverse();
195 }
196
197 template <typename T>
199 {
200 SquareMatrix<T, 3> t = SquareMatrix<T, 3>(*this) * mat2.inverse();
201 *this = t;
202
203 return *this;
204 }
205
206 template <typename T>
207 DYN_FUNC const SquareMatrix<T, 3> SquareMatrix<T, 3>::operator/ (const T& scale) const
208 {
210 res.data_[0] = data_[0] / scale;
211 res.data_[1] = data_[1] / scale;
212 res.data_[2] = data_[2] / scale;
213
214 return res;
215 }
216
217 template <typename T>
219 {
220 data_[0] /= scale;
221 data_[1] /= scale;
222 data_[2] /= scale;
223 return *this;
224 }
225
226 template <typename T>
228 {
230 res.data_[0] = -data_[0];
231 res.data_[1] = -data_[1];
232 res.data_[2] = -data_[2];
233 return res;
234 }
235
236 template <typename T>
238 {
240 res.data_[0][0] = data_[0][0];
241 res.data_[0][1] = data_[1][0];
242 res.data_[0][2] = data_[2][0];
243
244 res.data_[1][0] = data_[0][1];
245 res.data_[1][1] = data_[1][1];
246 res.data_[1][2] = data_[2][1];
247
248 res.data_[2][0] = data_[0][2];
249 res.data_[2][1] = data_[1][2];
250 res.data_[2][2] = data_[2][2];
251
252 return res;
253 }
254
255 template <typename T>
257 {
258 T OneOverDeterminant = static_cast<T>(1) / determinant();
259
261 res.data_[0][0] = +(data_[1][1] * data_[2][2] - data_[2][1] * data_[1][2]) * OneOverDeterminant;
262 res.data_[1][0] = -(data_[1][0] * data_[2][2] - data_[2][0] * data_[1][2]) * OneOverDeterminant;
263 res.data_[2][0] = +(data_[1][0] * data_[2][1] - data_[2][0] * data_[1][1]) * OneOverDeterminant;
264 res.data_[0][1] = -(data_[0][1] * data_[2][2] - data_[2][1] * data_[0][2]) * OneOverDeterminant;
265 res.data_[1][1] = +(data_[0][0] * data_[2][2] - data_[2][0] * data_[0][2]) * OneOverDeterminant;
266 res.data_[2][1] = -(data_[0][0] * data_[2][1] - data_[2][0] * data_[0][1]) * OneOverDeterminant;
267 res.data_[0][2] = +(data_[0][1] * data_[1][2] - data_[1][1] * data_[0][2]) * OneOverDeterminant;
268 res.data_[1][2] = -(data_[0][0] * data_[1][2] - data_[1][0] * data_[0][2]) * OneOverDeterminant;
269 res.data_[2][2] = +(data_[0][0] * data_[1][1] - data_[1][0] * data_[0][1]) * OneOverDeterminant;
270
271 return res;
272 }
273
274 template <typename T>
276 {
277 return data_[0][0] * (data_[1][1] * data_[2][2] - data_[2][1] * data_[1][2])
278 - data_[1][0] * (data_[0][1] * data_[2][2] - data_[2][1] * data_[0][2])
279 + data_[2][0] * (data_[0][1] * data_[1][2] - data_[1][1] * data_[0][2]);
280 }
281
282 template <typename T>
284 {
285 return (*this)(0, 0) + (*this)(1, 1) + (*this)(2, 2);
286 }
287
288 template <typename T>
290 {
291 T result = 0;
292 for (unsigned int i = 0; i < 3; ++i)
293 for (unsigned int j = 0; j < 3; ++j)
294 result += (*this)(i, j)*mat2(i, j);
295 return result;
296 }
297
298 template <typename T>
300 {
301 T result = 0;
302 for (unsigned int i = 0; i < 3; ++i)
303 for (unsigned int j = 0; j < 3; ++j)
304 result += (*this)(i, j)*(*this)(i, j);
305 return glm::sqrt(result);
306 }
307
308
309 template <typename T>
311 {
312 const SquareMatrix<T, 3>& A = (*this);
313 const T sum1 = fabs(A(0, 0)) + fabs(A(1, 0)) + fabs(A(2, 0));
314 const T sum2 = fabs(A(0, 1)) + fabs(A(1, 1)) + fabs(A(2, 1));
315 const T sum3 = fabs(A(0, 2)) + fabs(A(1, 2)) + fabs(A(2, 2));
316 T maxSum = sum1;
317 if (sum2 > maxSum)
318 maxSum = sum2;
319 if (sum3 > maxSum)
320 maxSum = sum3;
321 return maxSum;
322 }
323
324 template <typename T>
326 {
327 const SquareMatrix<T, 3>& A = (*this);
328 const T sum1 = fabs(A(0, 0)) + fabs(A(0, 1)) + fabs(A(0, 2));
329 const T sum2 = fabs(A(1, 0)) + fabs(A(1, 1)) + fabs(A(1, 2));
330 const T sum3 = fabs(A(2, 0)) + fabs(A(2, 1)) + fabs(A(2, 2));
331 T maxSum = sum1;
332 if (sum2 > maxSum)
333 maxSum = sum2;
334 if (sum3 > maxSum)
335 maxSum = sum3;
336 return maxSum;
337 }
338
339 template <typename T>
341 {
342 return SquareMatrix<T, 3>(1.0, 0.0, 0.0,
343 0.0, 1.0, 0.0,
344 0.0, 0.0, 1.0);
345 }
346
347 template <typename T>
349 {
350 return SquareMatrix<T, 3>(vec[0], 0.0, 0.0,
351 0.0, vec[1], 0.0,
352 0.0, 0.0, vec[2]);
353 }
354
355}
DYN_FUNC T determinant() const
DYN_FUNC const SquareMatrix< T, 3 > transpose() const
Vector< T, 3 > data_[3]
Definition Matrix3x3.h:79
#define T(t)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25