Jpp test-rotations-old
the software that should make you happy
Loading...
Searching...
No Matches
JMatrix4D.hh
Go to the documentation of this file.
1#ifndef __JMATRIX4D__
2#define __JMATRIX4D__
3
4#include <limits>
5#include <cmath>
6#include <ostream>
7#include <iomanip>
8
10#include "JLang/JEquals.hh"
11#include "JLang/JManip.hh"
12#include "JMath/JMath.hh"
13#include "JMath/JMatrix3D.hh"
14
15
16/**
17 * \author mdejong
18 */
19
20namespace JMATH {}
21namespace JPP { using namespace JMATH; }
22
23namespace JMATH {
24
25 using JIO::JReader;
26 using JIO::JWriter;
27 using JLANG::JEquals;
28
29
30 /**
31 * 4 x 4 matrix
32 */
33 class JMatrix4D :
34 public JMath <JMatrix4D>,
35 public JEquals<JMatrix4D>
36 {
37 public:
38
39 using JMath<JMatrix4D>::mul;
40
41
42 /**
43 * Default constructor.
44 */
46 a00(0.0), a01(0.0), a02(0.0), a03(0.0),
47 a10(0.0), a11(0.0), a12(0.0), a13(0.0),
48 a20(0.0), a21(0.0), a22(0.0), a23(0.0),
49 a30(0.0), a31(0.0), a32(0.0), a33(0.0)
50 {}
51
52
53 /**
54 * Contructor.
55 *
56 * \param __a00 (0,0)
57 * \param __a01 (0,1)
58 * \param __a02 (0,2)
59 * \param __a03 (0,3)
60 * \param __a10 (1,0)
61 * \param __a11 (1,1)
62 * \param __a12 (1,2)
63 * \param __a13 (1,3)
64 * \param __a20 (2,0)
65 * \param __a21 (2,1)
66 * \param __a22 (2,2)
67 * \param __a23 (2,3)
68 * \param __a30 (3,0)
69 * \param __a31 (3,1)
70 * \param __a32 (3,2)
71 * \param __a33 (3,3)
72 */
73 JMatrix4D(const double __a00, const double __a01, const double __a02, const double __a03,
74 const double __a10, const double __a11, const double __a12, const double __a13,
75 const double __a20, const double __a21, const double __a22, const double __a23,
76 const double __a30, const double __a31, const double __a32, const double __a33) :
77 a00(__a00), a01(__a01), a02(__a02), a03(__a03),
78 a10(__a10), a11(__a11), a12(__a12), a13(__a13),
79 a20(__a20), a21(__a21), a22(__a22), a23(__a23),
80 a30(__a30), a31(__a31), a32(__a32), a33(__a33)
81 {}
82
83
84 /**
85 * Get reference to unique instance of this class object.
86 *
87 * \return zero matrix
88 */
89 static const JMatrix4D& getInstance()
90 {
91 static JMatrix4D matrix;
92
93 return matrix;
94 }
95
96
97 /**
98 * Set to identity matrix
99 *
100 * \return this matrix
101 */
103 {
104 a00 = 1.0; a01 = 0.0; a02 = 0.0; a03 = 0.0;
105 a10 = 0.0; a11 = 1.0; a12 = 0.0; a13 = 0.0;
106 a20 = 0.0; a21 = 0.0; a22 = 1.0; a23 = 0.0;
107 a30 = 0.0; a31 = 0.0; a32 = 0.0; a33 = 1.0;
108
109 return *this;
110 }
111
112
113 /**
114 * Get reference to unique instance of this class object.
115 *
116 * \return identity matrix
117 */
118 static const JMatrix4D& getIdentity()
119 {
120 static JMatrix4D matrix(JMatrix4D().setIdentity());
121
122 return matrix;
123 }
124
125
126 /**
127 * Set matrix.
128 *
129 * \param A matrix
130 */
131 void set(const JMatrix4D& A)
132 {
133 static_cast<JMatrix4D&>(*this) = A;
134 }
135
136
137 /**
138 * Set matrix to the null matrix.
139 *
140 * \return this matrix
141 */
143 {
144 *this = JMatrix4D();
145
146 return *this;
147 }
148
149
150 /**
151 * Transpose.
152 *
153 * \return this matrix
154 */
156 {
157 using std::swap;
158
159 swap(a10, a01);
160 swap(a20, a02);
161 swap(a21, a12);
162 swap(a30, a03);
163 swap(a31, a13);
164 swap(a32, a23);
165
166 return *this;
167 }
168
169
170 /**
171 * Negate matrix.
172 *
173 * \return -this matrix
174 */
176 {
177 a00 = -a00; a01 = -a01; a02 = -a02; a03 = -a03;
178 a10 = -a10; a11 = -a11; a12 = -a12; a13 = -a13;
179 a20 = -a20; a21 = -a21; a22 = -a22; a13 = -a23;
180 a30 = -a30; a31 = -a31; a32 = -a32; a33 = -a33;
181
182 return *this;
183 }
184
185
186 /**
187 * Matrix addition.
188 *
189 * \param A matrix
190 * \return this matrix + A
191 */
193 {
194 a00 += A.a00; a01 += A.a01; a02 += A.a02; a03 += A.a03;
195 a10 += A.a10; a11 += A.a11; a12 += A.a12; a13 += A.a13;
196 a20 += A.a20; a21 += A.a21; a22 += A.a22; a23 += A.a23;
197 a30 += A.a30; a31 += A.a31; a32 += A.a32; a33 += A.a33;
198
199 return *this;
200 }
201
202
203 /**
204 * Matrix subtraction.
205 *
206 * \param A matrix
207 * \return this matrix - A
208 */
210 {
211 a00 -= A.a00; a01 -= A.a01; a02 -= A.a02; a03 -= A.a03;
212 a10 -= A.a10; a11 -= A.a11; a12 -= A.a12; a13 -= A.a13;
213 a20 -= A.a20; a21 -= A.a21; a22 -= A.a22; a23 -= A.a23;
214 a30 -= A.a30; a31 -= A.a31; a32 -= A.a32; a33 -= A.a33;
215
216 return *this;
217 }
218
219
220 /**
221 * Scale matrix.
222 *
223 * \param factor factor
224 * \return this matrix * factor
225 */
226 JMatrix4D& mul(const double factor)
227 {
228 a00 *= factor; a01 *= factor; a02 *= factor; a03 *= factor;
229 a10 *= factor; a11 *= factor; a12 *= factor; a13 *= factor;
230 a20 *= factor; a21 *= factor; a22 *= factor; a23 *= factor;
231 a30 *= factor; a31 *= factor; a32 *= factor; a33 *= factor;
232
233 return *this;
234 }
235
236
237 /**
238 * Scale matrix.
239 *
240 * \param factor factor
241 * \return this matrix / factor
242 */
243 JMatrix4D& div(const double factor)
244 {
245 a00 /= factor; a01 /= factor; a02 /= factor; a03 /= factor;
246 a10 /= factor; a11 /= factor; a12 /= factor; a13 /= factor;
247 a20 /= factor; a21 /= factor; a22 /= factor; a23 /= factor;
248 a30 /= factor; a31 /= factor; a32 /= factor; a33 /= factor;
249
250 return *this;
251 }
252
253
254 /**
255 * Matrix multiplication.
256 *
257 * \param A matrix
258 * \param B matrix
259 * \return this matrix
260 */
261 const JMatrix4D& mul(const JMatrix4D& A,
262 const JMatrix4D& B)
263 {
264 a00 = A.a00 * B.a00 + A.a01 * B.a10 + A.a02 * B.a20 + A.a03 * B.a30;
265 a01 = A.a00 * B.a01 + A.a01 * B.a11 + A.a02 * B.a21 + A.a03 * B.a31;
266 a02 = A.a00 * B.a02 + A.a01 * B.a12 + A.a02 * B.a22 + A.a03 * B.a32;
267 a03 = A.a00 * B.a03 + A.a01 * B.a13 + A.a02 * B.a23 + A.a03 * B.a33;
268
269 a10 = A.a10 * B.a00 + A.a11 * B.a10 + A.a12 * B.a20 + A.a13 * B.a30;
270 a11 = A.a10 * B.a01 + A.a11 * B.a11 + A.a12 * B.a21 + A.a13 * B.a31;
271 a12 = A.a10 * B.a02 + A.a11 * B.a12 + A.a12 * B.a22 + A.a13 * B.a32;
272 a13 = A.a10 * B.a03 + A.a11 * B.a13 + A.a12 * B.a23 + A.a13 * B.a33;
273
274 a20 = A.a20 * B.a00 + A.a21 * B.a10 + A.a22 * B.a20 + A.a23 * B.a30;
275 a21 = A.a20 * B.a01 + A.a21 * B.a11 + A.a22 * B.a21 + A.a23 * B.a31;
276 a22 = A.a20 * B.a02 + A.a21 * B.a12 + A.a22 * B.a22 + A.a23 * B.a32;
277 a23 = A.a20 * B.a03 + A.a21 * B.a13 + A.a22 * B.a23 + A.a23 * B.a33;
278
279 a30 = A.a30 * B.a00 + A.a31 * B.a10 + A.a32 * B.a20 + A.a33 * B.a30;
280 a31 = A.a30 * B.a01 + A.a31 * B.a11 + A.a32 * B.a21 + A.a33 * B.a31;
281 a32 = A.a30 * B.a02 + A.a31 * B.a12 + A.a32 * B.a22 + A.a33 * B.a32;
282 a33 = A.a30 * B.a03 + A.a31 * B.a13 + A.a32 * B.a23 + A.a33 * B.a33;
283
284 return *this;
285 }
286
287
288 /**
289 * Equality.
290 *
291 * \param A matrix
292 * \param eps numerical precision
293 * \return true if matrices identical; else false
294 */
295 bool equals(const JMatrix4D& A,
296 const double eps = std::numeric_limits<double>::min()) const
297 {
298 return (fabs(a00 - A.a00) <= eps &&
299 fabs(a01 - A.a01) <= eps &&
300 fabs(a02 - A.a02) <= eps &&
301 fabs(a03 - A.a03) <= eps &&
302 fabs(a10 - A.a10) <= eps &&
303 fabs(a11 - A.a11) <= eps &&
304 fabs(a12 - A.a12) <= eps &&
305 fabs(a13 - A.a13) <= eps &&
306 fabs(a20 - A.a20) <= eps &&
307 fabs(a21 - A.a21) <= eps &&
308 fabs(a22 - A.a22) <= eps &&
309 fabs(a23 - A.a23) <= eps &&
310 fabs(a30 - A.a30) <= eps &&
311 fabs(a31 - A.a31) <= eps &&
312 fabs(a32 - A.a32) <= eps &&
313 fabs(a33 - A.a33) <= eps);
314 }
315
316
317 /**
318 * Test identity.
319 *
320 * \param eps numerical precision
321 * \return true if identity matrix; else false
322 */
323 bool isIdentity(const double eps = std::numeric_limits<double>::min()) const
324 {
325 return equals(getIdentity(), eps);
326 }
327
328
329 /**
330 * Get determinant of matrix.
331 *
332 * \return determinant of matrix
333 */
334 double getDeterminant() const
335 {
336 double det = 0.0;
337
338 det += a00 * JMatrix3D(a11, a12, a13,
339 a21, a22, a23,
341
342 det -= a01 * JMatrix3D(a10, a12, a13,
343 a20, a22, a23,
345
346 det += a02 * JMatrix3D(a10, a11, a13,
347 a20, a21, a23,
349
350 det -= a03 * JMatrix3D(a10, a11, a12,
351 a20, a21, a22,
353
354 return det;
355 }
356
357
358 /**
359 * Transform.
360 *
361 * \param __x0 x0 value
362 * \param __x1 x1 value
363 * \param __x2 x2 value
364 * \param __x3 x3 value
365 */
366 void transform(double& __x0, double& __x1, double& __x2, double& __x3) const
367 {
368 const double x0 = a00 * __x0 + a01 * __x1 + a02 * __x2 + a03 * __x3;
369 const double x1 = a10 * __x0 + a11 * __x1 + a12 * __x2 + a13 * __x3;
370 const double x2 = a20 * __x0 + a21 * __x1 + a22 * __x2 + a23 * __x3;
371 const double x3 = a30 * __x0 + a31 * __x1 + a32 * __x2 + a33 * __x3;
372
373 __x0 = x0;
374 __x1 = x1;
375 __x2 = x2;
376 __x3 = x3;
377 }
378
379
380 /**
381 * Read matrix from input.
382 *
383 * \param in reader
384 * \param matrix matrix
385 * \return reader
386 */
387 friend inline JReader& operator>>(JReader& in, JMatrix4D& matrix)
388 {
389 in >> matrix.a00; in >> matrix.a01; in >> matrix.a02; in >> matrix.a03;
390 in >> matrix.a10; in >> matrix.a11; in >> matrix.a12; in >> matrix.a13;
391 in >> matrix.a20; in >> matrix.a21; in >> matrix.a22; in >> matrix.a23;
392 in >> matrix.a30; in >> matrix.a31; in >> matrix.a32; in >> matrix.a33;
393
394 return in;
395 }
396
397
398 /**
399 * Write matrix to output.
400 *
401 * \param out writer
402 * \param matrix matrix
403 * \return writer
404 */
405 friend inline JWriter& operator<<(JWriter& out, const JMatrix4D& matrix)
406 {
407 out << matrix.a00; out << matrix.a01; out << matrix.a02; out << matrix.a03;
408 out << matrix.a10; out << matrix.a11; out << matrix.a12; out << matrix.a13;
409 out << matrix.a20; out << matrix.a21; out << matrix.a22; out << matrix.a23;
410 out << matrix.a30; out << matrix.a31; out << matrix.a32; out << matrix.a33;
411
412 return out;
413 }
414
415
416 /**
417 * Print ASCII formatted output.
418 *
419 * \param out output stream
420 * \param A matrix
421 * \return output stream
422 */
423 friend inline std::ostream& operator<<(std::ostream& out, const JMatrix4D& A)
424 {
425 using namespace std;
426
427 const JFormat format(out, getFormat<JMatrix4D>(JFormat_t(10, 3, std::ios::fixed | std::ios::showpos)));
428
429 out << format << A.a00 << ' ' << format << A.a01 << ' ' << format << A.a02 << ' ' << format << A.a03 << endl;
430 out << format << A.a10 << ' ' << format << A.a11 << ' ' << format << A.a12 << ' ' << format << A.a13 << endl;
431 out << format << A.a20 << ' ' << format << A.a21 << ' ' << format << A.a22 << ' ' << format << A.a23 << endl;
432 out << format << A.a30 << ' ' << format << A.a31 << ' ' << format << A.a32 << ' ' << format << A.a33 << endl;
433
434 return out;
435 }
436
437
438 double a00, a01, a02, a03;
439 double a10, a11, a12, a13;
440 double a20, a21, a22, a23;
441 double a30, a31, a32, a33;
442 };
443}
444
445#endif
I/O manipulators.
JFormat_t & getFormat()
Get format for given type.
Definition JManip.hh:682
Base class for data structures with artithmetic capabilities.
Interface for binary input.
Interface for binary output.
double getDeterminant() const
Get determinant of matrix.
4 x 4 matrix
Definition JMatrix4D.hh:36
JMatrix4D & setIdentity()
Set to identity matrix.
Definition JMatrix4D.hh:102
void transform(double &__x0, double &__x1, double &__x2, double &__x3) const
Transform.
Definition JMatrix4D.hh:366
const JMatrix4D & mul(const JMatrix4D &A, const JMatrix4D &B)
Matrix multiplication.
Definition JMatrix4D.hh:261
static const JMatrix4D & getIdentity()
Get reference to unique instance of this class object.
Definition JMatrix4D.hh:118
bool isIdentity(const double eps=std::numeric_limits< double >::min()) const
Test identity.
Definition JMatrix4D.hh:323
JMatrix4D(const double __a00, const double __a01, const double __a02, const double __a03, const double __a10, const double __a11, const double __a12, const double __a13, const double __a20, const double __a21, const double __a22, const double __a23, const double __a30, const double __a31, const double __a32, const double __a33)
Contructor.
Definition JMatrix4D.hh:73
JMatrix4D & add(const JMatrix4D &A)
Matrix addition.
Definition JMatrix4D.hh:192
JMatrix4D & sub(const JMatrix4D &A)
Matrix subtraction.
Definition JMatrix4D.hh:209
JMatrix4D()
Default constructor.
Definition JMatrix4D.hh:45
JMatrix4D & reset()
Set matrix to the null matrix.
Definition JMatrix4D.hh:142
double getDeterminant() const
Get determinant of matrix.
Definition JMatrix4D.hh:334
friend JReader & operator>>(JReader &in, JMatrix4D &matrix)
Read matrix from input.
Definition JMatrix4D.hh:387
JMatrix4D & transpose()
Transpose.
Definition JMatrix4D.hh:155
static const JMatrix4D & getInstance()
Get reference to unique instance of this class object.
Definition JMatrix4D.hh:89
JMatrix4D & negate()
Negate matrix.
Definition JMatrix4D.hh:175
JMatrix4D & div(const double factor)
Scale matrix.
Definition JMatrix4D.hh:243
void set(const JMatrix4D &A)
Set matrix.
Definition JMatrix4D.hh:131
bool equals(const JMatrix4D &A, const double eps=std::numeric_limits< double >::min()) const
Equality.
Definition JMatrix4D.hh:295
friend std::ostream & operator<<(std::ostream &out, const JMatrix4D &A)
Print ASCII formatted output.
Definition JMatrix4D.hh:423
friend JWriter & operator<<(JWriter &out, const JMatrix4D &matrix)
Write matrix to output.
Definition JMatrix4D.hh:405
JMatrix4D & mul(const double factor)
Scale matrix.
Definition JMatrix4D.hh:226
Auxiliary classes and methods for mathematical operations.
Definition JEigen3D.hh:88
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Data structure for format specifications.
Definition JManip.hh:524
Auxiliary class to temporarily define format specifications.
Definition JManip.hh:636
Template definition of auxiliary base class for comparison of data structures.
Definition JEquals.hh:84
Auxiliary base class for aritmetic operations of derived class types.
Definition JMath.hh:347