Jpp  15.0.1-rc.1-highqe
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 
9 #include "JIO/JSerialisable.hh"
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 
20 namespace JMATH {}
21 namespace JPP { using namespace JMATH; }
22 
23 namespace 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 
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,
340  a31, a32, a33).getDeterminant();
341 
342  det -= a01 * JMatrix3D(a10, a12, a13,
343  a20, a22, a23,
344  a30, a32, a33).getDeterminant();
345 
346  det += a02 * JMatrix3D(a10, a11, a13,
347  a20, a21, a23,
348  a30, a31, a33).getDeterminant();
349 
350  det -= a03 * JMatrix3D(a10, a11, a12,
351  a20, a21, a22,
352  a30, a31, a32).getDeterminant();
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
Interface for binary output.
Auxiliary base class for aritmetic operations of derived class types.
Definition: JMath.hh:110
bool isIdentity(const double eps=std::numeric_limits< double >::min()) const
Test identity.
Definition: JMatrix4D.hh:323
friend JReader & operator>>(JReader &in, JMatrix4D &matrix)
Read matrix from input.
Definition: JMatrix4D.hh:387
3 x 3 matrix
JMatrix4D & reset()
Set matrix to the null matrix.
Definition: JMatrix4D.hh:142
4 x 4 matrix
Definition: JMatrix4D.hh:33
JMatrix4D & transpose()
Transpose.
Definition: JMatrix4D.hh:155
JMatrix4D & sub(const JMatrix4D &A)
Matrix subtraction.
Definition: JMatrix4D.hh:209
void transform(double &__x0, double &__x1, double &__x2, double &__x3) const
Transform.
Definition: JMatrix4D.hh:366
JMatrix4D & div(const double factor)
Scale matrix.
Definition: JMatrix4D.hh:243
JMatrix4D & add(const JMatrix4D &A)
Matrix addition.
Definition: JMatrix4D.hh:192
Auxiliary class to temporarily define format specifications.
Definition: JManip.hh:632
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 & setIdentity()
Set to identity matrix.
Definition: JMatrix4D.hh:102
bool equals(const JMatrix4D &A, const double eps=std::numeric_limits< double >::min()) const
Equality.
Definition: JMatrix4D.hh:295
const JMatrix4D & mul(const JMatrix4D &A, const JMatrix4D &B)
Matrix multiplication.
Definition: JMatrix4D.hh:261
static const JMatrix4D & getInstance()
Get reference to unique instance of this class object.
Definition: JMatrix4D.hh:89
Template definition of auxiliary base class for comparison of data structures.
Definition: JEquals.hh:24
double getDeterminant() const
Get determinant of matrix.
Definition: JMatrix4D.hh:334
Interface for binary input.
I/O manipulators.
JMatrix4D & mul(const double factor)
Scale matrix.
Definition: JMatrix4D.hh:226
static const JMatrix4D & getIdentity()
Get reference to unique instance of this class object.
Definition: JMatrix4D.hh:118
friend std::ostream & operator<<(std::ostream &out, const JMatrix4D &A)
Print ASCII formatted output.
Definition: JMatrix4D.hh:423
double getDeterminant() const
Get determinant of matrix.
Base class for data structures with artithmetic capabilities.
JMatrix4D()
Default constructor.
Definition: JMatrix4D.hh:45
void set(const JMatrix4D &A)
Set matrix.
Definition: JMatrix4D.hh:131
friend JWriter & operator<<(JWriter &out, const JMatrix4D &matrix)
Write matrix to output.
Definition: JMatrix4D.hh:405
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
Definition: JCanberra.sh:41
Data structure for format specifications.
Definition: JManip.hh:522
JMatrix4D & negate()
Negate matrix.
Definition: JMatrix4D.hh:175
source $JPP_DIR setenv csh $JPP_DIR eval JShellParser o a A