PeriDyno 1.0.0
Loading...
Searching...
No Matches
Matrix2x2.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) //delegating ctor
17 {
18 }
19
20 template <typename T>
21 DYN_FUNC SquareMatrix<T, 2>::SquareMatrix(T x00, T x01, T x10, T x11)
22 : data_(x00, x10, x01, x11)
23 {
24 }
25
26 template <typename T>
28 : data_(row1[0], row2[0], row1[1], row2[1])
29 {
30 }
31
32 template <typename T>
34 {
35 data_ = mat.data_;
36 }
37
38 template <typename T>
40 {
41
42 }
43
44 template <typename T>
45 DYN_FUNC T& SquareMatrix<T, 2>::operator() (unsigned int i, unsigned int j)
46 {
47 return const_cast<T &>(static_cast<const SquareMatrix<T, 2> &>(*this)(i, j));
48 }
49
50 template <typename T>
51 DYN_FUNC const T& SquareMatrix<T, 2>::operator() (unsigned int i, unsigned int j) const
52 {
53 return data_[j][i];
54 }
55
56 template <typename T>
57 DYN_FUNC const Vector<T, 2> SquareMatrix<T, 2>::row(unsigned int i) const
58 {
59 Vector<T, 2> result((*this)(i, 0), (*this)(i, 1));
60 return result;
61 }
62
63 template <typename T>
64 DYN_FUNC const Vector<T, 2> SquareMatrix<T, 2>::col(unsigned int i) const
65 {
66 Vector<T, 2> result((*this)(0, i), (*this)(1, i));
67 return result;
68 }
69
70 template <typename T>
71 DYN_FUNC void SquareMatrix<T, 2>::setRow(unsigned int i, const Vector<T, 2>& vec)
72 {
73 data_[0][i] = vec[0];
74 data_[1][i] = vec[1];
75 }
76
77 template <typename T>
78 DYN_FUNC void SquareMatrix<T, 2>::setCol(unsigned int j, const Vector<T, 2>& vec)
79 {
80 data_[j][0] = vec[0];
81 data_[j][1] = vec[1];
82 }
83
84 template <typename T>
86 {
87 return SquareMatrix<T, 2>(*this) += mat2;
88 }
89
90 template <typename T>
92 {
93 data_ += mat2.data_;
94 return *this;
95 }
96
97 template <typename T>
99 {
100 return SquareMatrix<T, 2>(*this) -= mat2;
101 }
102
103 template <typename T>
105 {
106 data_ -= mat2.data_;
107 return *this;
108 }
109
110
111 template <typename T>
113 {
114 data_ = mat.data_;
115 return *this;
116 }
117
118 template <typename T>
120 {
121 return data_ == mat2.data_;
122 }
123
124 template <typename T>
126 {
127 return !((*this) == mat2);
128 }
129
130 template <typename T>
131 DYN_FUNC const SquareMatrix<T, 2> SquareMatrix<T, 2>::operator* (const T& scale) const
132 {
133 return SquareMatrix<T, 2>(*this) *= scale;
134 }
135
136 template <typename T>
138 {
139 data_ *= scale;
140 return *this;
141 }
142
143 template <typename T>
145 {
146 Vector<T, 2> result(0);
147 for (unsigned int i = 0; i < 2; ++i)
148 for (unsigned int j = 0; j < 2; ++j)
149 result[i] += (*this)(i, j) * vec[j];
150 return result;
151 }
152
153 template <typename T>
155 {
156 return SquareMatrix<T, 2>(*this) *= mat2;
157 }
158
159 template <typename T>
161 {
162 data_ *= mat2.data_;
163 return *this;
164 }
165
166 template <typename T>
168 {
169 return SquareMatrix<T, 2>(*this) *= mat2.inverse();
170 }
171
172 template <typename T>
174 {
175 data_ *= glm::inverse(mat2.data_);
176 return *this;
177 }
178
179 template <typename T>
180 DYN_FUNC const SquareMatrix<T, 2> SquareMatrix<T, 2>::operator/ (const T& scale) const
181 {
182 return SquareMatrix<T, 2>(*this) /= scale;
183 }
184
185 template <typename T>
187 {
188 // #ifndef __CUDA_ARCH__
189 // if (abs(scale) <= std::numeric_limits<T>::epsilon())
190 // throw PhysikaException("Matrix Divide by zero error!");
191 // #endif
192 data_ /= scale;
193 return *this;
194 }
195
196 template <typename T>
198 {
200 res.data_ = -data_;
201 return res;
202 }
203
204 template <typename T>
206 {
208 res.data_ = glm::transpose(data_);
209 return res;
210 }
211
212 template <typename T>
214 {
216 res.data_ = glm::inverse(data_);
217
218 return res;
219 }
220
221 template <typename T>
223 {
224 return glm::determinant(data_);
225 }
226
227 template <typename T>
229 {
230 return (*this)(0, 0) + (*this)(1, 1);
231 }
232
233 template <typename T>
235 {
236 T result = 0;
237 for (unsigned int i = 0; i < 2; ++i)
238 for (unsigned int j = 0; j < 2; ++j)
239 result += (*this)(i, j)*mat2(i, j);
240 return result;
241 }
242
243 template <typename T>
245 {
246 T result = 0;
247 for (unsigned int i = 0; i < 2; ++i)
248 for (unsigned int j = 0; j < 2; ++j)
249 result += (*this)(i, j)*(*this)(i, j);
250 return glm::sqrt(result);
251 }
252
253 template <typename T>
255 {
256 const SquareMatrix<T, 2>& A = (*this);
257 const T sum1 = fabs(A(0, 0)) + fabs(A(1, 0));
258 const T sum2 = fabs(A(0, 1)) + fabs(A(1, 1));
259 T maxSum = sum1;
260 if (sum2 > maxSum)
261 maxSum = sum2;
262 return maxSum;
263 }
264
265 template <typename T>
267 {
268 const SquareMatrix<T, 2>& A = (*this);
269 const T sum1 = fabs(A(0, 0)) + fabs(A(0, 1));
270 const T sum2 = fabs(A(1, 0)) + fabs(A(1, 1));
271 T maxSum = sum1;
272 if (sum2 > maxSum)
273 maxSum = sum2;
274 return maxSum;
275 }
276
277 template <typename T>
279 {
280 return SquareMatrix<T, 2>(1.0, 0.0,
281 0.0, 1.0);
282 }
283}
glm::tmat2x2< T > data_
Definition Matrix2x2.h:73
#define T(t)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25