cctw  0.2.1
cctwmatrix3x3.cpp
Go to the documentation of this file.
1 #include "cctwmatrix3x3.h"
2 #include <math.h>
3 
4 template <typename T>
6 {
7  setToIdentity();
8 }
9 
10 template <typename T>
12 {
13  for (int row=0; row<3; ++row) {
14  m_Matrix[row][0]=c1(row);
15  m_Matrix[row][1]=c2(row);
16  m_Matrix[row][2]=c3(row);
17  }
18 }
19 
20 template <typename T>
21 CctwMatrix3x3<T>::CctwMatrix3x3(T a11, T a12, T a13, T a21, T a22, T a23, T a31, T a32, T a33)
22 {
23  m_Matrix[0][0] = a11;
24  m_Matrix[0][1] = a12;
25  m_Matrix[0][2] = a13;
26  m_Matrix[1][0] = a21;
27  m_Matrix[1][1] = a22;
28  m_Matrix[1][2] = a23;
29  m_Matrix[2][0] = a31;
30  m_Matrix[2][1] = a32;
31  m_Matrix[2][2] = a33;
32 }
33 
34 template <typename T>
35 T& CctwMatrix3x3<T>::operator ()(int row, int col)
36 {
37  return m_Matrix[row][col];
38 }
39 
40 template <typename T>
41 const T& CctwMatrix3x3<T>::operator ()(int row, int col) const
42 {
43  return m_Matrix[row][col];
44 }
45 
46 template <typename T>
48 {
49  CctwMatrix3x3<T> result;
50  for (int row = 0; row < 3; ++row) {
51  for (int col = 0; col < 3; ++col) {
52  result.m_Matrix[row][col] = m_Matrix[row][col] + mat.m_Matrix[row][col];
53  }
54  }
55  return result;
56 }
57 
58 template <typename T>
60 {
61  for (int row = 0; row < 3; ++row) {
62  for (int col = 0; col < 3; ++col) {
63  m_Matrix[row][col] += mat.m_Matrix[row][col];
64  }
65  }
66  return *this;
67 }
68 
69 template <typename T>
71 {
72  CctwMatrix3x3<T> result;
73  for (int row = 0; row < 3; ++row) {
74  for (int col = 0; col < 3; ++col) {
75  result.m_Matrix[row][col] = m_Matrix[row][col] - mat.m_Matrix[row][col];
76  }
77  }
78 
79  return result;
80 }
81 
82 template <typename T>
84 {
85  for (int row = 0; row < 3; ++row) {
86  for (int col = 0; col < 3; ++col) {
87  m_Matrix[row][col] -= mat.m_Matrix[row][col];
88  }
89  }
90 
91  return *this;
92 }
93 
94 template <typename T>
96 {
97  CctwMatrix3x3<T> result;
98  for (int row = 0; row < 3; ++row) {
99  for (int col = 0; col < 3; ++col) {
100  T sum(0.0f);
101  for (int j = 0; j < 3; ++j) {
102  sum += m_Matrix[row][j] * mat.m_Matrix[j][col];
103  }
104  result.m_Matrix[row][col] = sum;
105  }
106  }
107  return result;
108 }
109 
110 template <typename T>
112 {
113  CctwVector3D<T> result;
114  for (int row = 0; row < 3; ++row) {
115  T sum(0.0f);
116  for (int j = 0; j < 3; ++j) {
117  sum += m_Matrix[row][j] * vec(j);
118  }
119  result(row) = sum;
120  }
121  return result;
122 }
123 
124 template <typename T>
126 {
127  for (int row = 0; row < 3; ++row) {
128  for (int col = 0; col < 3; ++col) {
129  if (m_Matrix[row][col] != mat.m_Matrix[row][col]) {
130  return false;
131  }
132  }
133  }
134 
135  return true;
136 }
137 
138 template <typename T>
140 {
141  for (int row = 0; row < 3; ++row) {
142  for (int col = 0; col < 3; ++col) {
143  if (m_Matrix[row][col] != mat.m_Matrix[row][col]) {
144  return true;
145  }
146  }
147  }
148 
149  return false;
150 }
151 
152 template <typename T>
154 {
155  for (int col = 0; col < 3; ++col) {
156  for (int row = 0; row < 3; ++row) {
157  if (row == col) {
158  m_Matrix[row][col] = 1.0f;
159  } else {
160  m_Matrix[row][col] = 0.0f;
161  }
162  }
163  }
164 }
165 
166 template <typename T>
168 {
169  double
170  a = m_Matrix[0][0],
171  b = m_Matrix[0][1],
172  c = m_Matrix[0][2],
173  d = m_Matrix[1][0],
174  e = m_Matrix[1][1],
175  f = m_Matrix[1][2],
176  g = m_Matrix[2][0],
177  h = m_Matrix[2][1],
178  k = m_Matrix[2][2];
179 
180  return a*(e*k - f*h) + b*(f*g - d*k) + c*(d*h - e*g);
181 }
182 
183 template <typename T>
185 {
186  CctwMatrix3x3<T> inv;
187  double det = determinant();
188 
189  if (det != 0.0) {
190  double
191  a = m_Matrix[0][0],
192  b = m_Matrix[1][0],
193  c = m_Matrix[2][0],
194  d = m_Matrix[0][1],
195  e = m_Matrix[1][1],
196  f = m_Matrix[2][1],
197  g = m_Matrix[0][2],
198  h = m_Matrix[1][2],
199  k = m_Matrix[2][2];
200 
201  inv.m_Matrix[0][0] = (e*k - f*h)/det;
202  inv.m_Matrix[1][0] =-(b*k - c*h)/det;
203  inv.m_Matrix[2][0] = (b*f - c*e)/det;
204 
205  inv.m_Matrix[0][1] =-(d*k - f*g)/det;
206  inv.m_Matrix[1][1] = (a*k - c*g)/det;
207  inv.m_Matrix[2][1] =-(a*f - c*d)/det;
208 
209  inv.m_Matrix[0][2] = (d*h - e*g)/det;
210  inv.m_Matrix[1][2] =-(a*h - b*g)/det;
211  inv.m_Matrix[2][2] = (a*e - b*d)/det;
212 
213  if (invertible) {
214  *invertible = true;
215  }
216  } else {
217  if (invertible) {
218  *invertible = false;
219  }
220  }
221 
222  return inv;
223 }
224 
225 template <typename T>
227 {
228  CctwMatrix3x3<T> tr;
229 
230  for (int i=0; i<3; i++) {
231  for (int j=0; j<3; j++) {
232  tr(j,i) = operator() (i,j);
233  }
234  }
235 
236  return tr;
237 }
238 
239 template <typename T>
240 CctwMatrix3x3<T> CctwMatrix3x3<T>::rotationMatrix(double r1, double r2, double r3)
241 {
245 
246  return rx*ry*rz;
247 }
248 
249 template <typename T>
251 {
252  CctwMatrix3x3<T> res;
253  T cosr = ::cos(r),
254  sinr = ::sin(r);
255 
256  res(1,1) = cosr;
257  res(1,2) = -sinr;
258  res(2,1) = sinr;
259  res(2,2) = cosr;
260 
261  return res;
262 }
263 
264 template <typename T>
266 {
267  CctwMatrix3x3<T> res;
268  T cosr = ::cos(r),
269  sinr = ::sin(r);
270 
271  res(0,0) = cosr;
272  res(0,2) = sinr;
273  res(2,0) = -sinr;
274  res(2,2) = cosr;
275 
276  return res;
277 }
278 
279 template <typename T>
281 {
282  CctwMatrix3x3<T> res;
283  T cosr = ::cos(r),
284  sinr = ::sin(r);
285 
286  res(0,0) = cosr;
287  res(0,1) = -sinr;
288  res(1,0) = sinr;
289  res(1,1) = cosr;
290 
291  return res;
292 }
293 
294 template <typename T>
296 {
297  return CctwMatrix3x3<T>(0,0,0,0,0,0,0,0,0);
298 }
299 
300 template <typename T>
302 {
303  return CctwMatrix3x3<T>(1,0,0, 0,1,0, 0,0,1);
304 }
305 
306 template <typename T>
307 void CctwMatrix3x3<T>::setSettingsValue(QSettings *settings, QString name)
308 {
309  settings->beginGroup(name);
310 
311  for (int r=0; r<3; r++) {
312  for (int c=0; c<3; c++) {
313  settings->setValue(QString("r%1c%2").arg(r).arg(c), operator()(r,c));
314  }
315  }
316 
317  settings->endGroup();
318 }
319 
320 template <>
321 void CctwMatrix3x3<double>::customSaver(const QVariant &val, QSettings *settings, QString name)
322 {
323  CctwDoubleMatrix3x3 mat = val.value<CctwDoubleMatrix3x3 >();
324 
325  mat.setSettingsValue(settings, name);
326 }
327 
328 template <>
329 void CctwMatrix3x3<int>::customSaver(const QVariant &val, QSettings *settings, QString name)
330 {
331  CctwIntMatrix3x3 mat = val.value<CctwIntMatrix3x3 >();
332 
333  mat.setSettingsValue(settings, name);
334 }
335 
336 template class CctwMatrix3x3<int>;
337 template class CctwMatrix3x3<double>;
static CctwMatrix3x3 rotZ(double r)
T & operator()(int row, int col)
static CctwMatrix3x3 rotX(double r)
CctwMatrix3x3 operator-=(const CctwMatrix3x3 &mat)
static CctwMatrix3x3 rotY(double r)
static CctwMatrix3x3 rotationMatrix(double r1, double r2, double r3)
double determinant() const
static void customSaver(const QVariant &val, QSettings *settings, QString name)
CctwMatrix3x3 operator+(const CctwMatrix3x3 &mat) const
CctwMatrix3x3 operator*(const CctwMatrix3x3 &mat) const
CctwMatrix3x3 operator-(const CctwMatrix3x3 &mat) const
CctwMatrix3x3 transposed() const
CctwMatrix3x3 inverted(bool *invertible=NULL) const
T m_Matrix[3][3]
Definition: cctwmatrix3x3.h:55
bool operator==(const CctwMatrix3x3 &mat) const
static CctwMatrix3x3 identity()
static CctwMatrix3x3 zero()
void setSettingsValue(QSettings *settings, QString name)
CctwMatrix3x3 operator+=(const CctwMatrix3x3 &mat)
bool operator!=(const CctwMatrix3x3 &mat) const