Jpp  15.0.0-rc.2
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JMath/JMatrix3D.hh
Go to the documentation of this file.
1 #ifndef __JMATRIX3D__
2 #define __JMATRIX3D__
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 
14 
15 /**
16  * \author mdejong
17  */
18 
19 namespace JMATH {}
20 namespace JPP { using namespace JMATH; }
21 
22 namespace JMATH {
23 
24  using JIO::JReader;
25  using JIO::JWriter;
26  using JLANG::JEquals;
27 
28 
29  /**
30  * 3 x 3 matrix
31  */
32  class JMatrix3D :
33  public JMath <JMatrix3D>,
34  public JEquals<JMatrix3D>
35  {
36  public:
37 
39 
40 
41  /**
42  * Default constructor.
43  */
45  a00(0.0), a01(0.0), a02(0.0),
46  a10(0.0), a11(0.0), a12(0.0),
47  a20(0.0), a21(0.0), a22(0.0)
48  {}
49 
50 
51  /**
52  * Contructor.
53  *
54  * \param __a00 (0,0)
55  * \param __a01 (0,1)
56  * \param __a02 (0,2)
57  * \param __a10 (1,0)
58  * \param __a11 (1,1)
59  * \param __a12 (1,2)
60  * \param __a20 (2,0)
61  * \param __a21 (2,1)
62  * \param __a22 (2,2)
63  */
64  JMatrix3D(const double __a00, const double __a01, const double __a02,
65  const double __a10, const double __a11, const double __a12,
66  const double __a20, const double __a21, const double __a22) :
67  a00(__a00), a01(__a01), a02(__a02),
68  a10(__a10), a11(__a11), a12(__a12),
69  a20(__a20), a21(__a21), a22(__a22)
70  {}
71 
72 
73  /**
74  * Get reference to unique instance of this class object.
75  *
76  * \return zero matrix
77  */
78  static const JMatrix3D& getInstance()
79  {
80  static JMatrix3D matrix;
81 
82  return matrix;
83  }
84 
85 
86  /**
87  * Set to identity matrix
88  *
89  * \return this matrix
90  */
92  {
93  a00 = 1.0; a01 = 0.0; a02 = 0.0;
94  a10 = 0.0; a11 = 1.0; a12 = 0.0;
95  a20 = 0.0; a21 = 0.0; a22 = 1.0;
96 
97  return *this;
98  }
99 
100 
101  /**
102  * Get reference to unique instance of this class object.
103  *
104  * \return identity matrix
105  */
106  static const JMatrix3D& getIdentity()
107  {
108  static JMatrix3D matrix(JMatrix3D().setIdentity());
109 
110  return matrix;
111  }
112 
113 
114  /**
115  * Set matrix.
116  *
117  * \param A matrix
118  */
119  void set(const JMatrix3D& A)
120  {
121  static_cast<JMatrix3D&>(*this) = A;
122  }
123 
124 
125  /**
126  * Set matrix to the null matrix.
127  *
128  * \return this matrix
129  */
131  {
132  *this = JMatrix3D();
133 
134  return *this;
135  }
136 
137 
138  /**
139  * Transpose.
140  *
141  * \return this matrix
142  */
144  {
145  using std::swap;
146 
147  swap(a10, a01);
148  swap(a20, a02);
149  swap(a21, a12);
150 
151  return *this;
152  }
153 
154 
155  /**
156  * Negate matrix.
157  *
158  * \return -this matrix
159  */
161  {
162  a00 = -a00; a01 = -a01; a02 = -a02;
163  a10 = -a10; a11 = -a11; a12 = -a12;
164  a20 = -a20; a21 = -a21; a22 = -a22;
165 
166  return *this;
167  }
168 
169 
170  /**
171  * Matrix addition.
172  *
173  * \param A matrix
174  * \return this matrix + A
175  */
177  {
178  a00 += A.a00; a01 += A.a01; a02 += A.a02;
179  a10 += A.a10; a11 += A.a11; a12 += A.a12;
180  a20 += A.a20; a21 += A.a21; a22 += A.a22;
181 
182  return *this;
183  }
184 
185 
186  /**
187  * Matrix subtraction.
188  *
189  * \param A matrix
190  * \return this matrix - A
191  */
193  {
194  a00 -= A.a00; a01 -= A.a01; a02 -= A.a02;
195  a10 -= A.a10; a11 -= A.a11; a12 -= A.a12;
196  a20 -= A.a20; a21 -= A.a21; a22 -= A.a22;
197 
198  return *this;
199  }
200 
201 
202  /**
203  * Scale matrix.
204  *
205  * \param factor factor
206  * \return this matrix * factor
207  */
208  JMatrix3D& mul(const double factor)
209  {
210  a00 *= factor; a01 *= factor; a02 *= factor;
211  a10 *= factor; a11 *= factor; a12 *= factor;
212  a20 *= factor; a21 *= factor; a22 *= factor;
213 
214  return *this;
215  }
216 
217 
218  /**
219  * Scale matrix.
220  *
221  * \param factor factor
222  * \return this matrix / factor
223  */
224  JMatrix3D& div(const double factor)
225  {
226  a00 /= factor; a01 /= factor; a02 /= factor;
227  a10 /= factor; a11 /= factor; a12 /= factor;
228  a20 /= factor; a21 /= factor; a22 /= factor;
229 
230  return *this;
231  }
232 
233 
234  /**
235  * Matrix multiplication.
236  *
237  * \param A matrix
238  * \param B matrix
239  * \return this matrix
240  */
242  const JMatrix3D& B)
243  {
244  a00 = A.a00 * B.a00 + A.a01 * B.a10 + A.a02 * B.a20;
245  a01 = A.a00 * B.a01 + A.a01 * B.a11 + A.a02 * B.a21;
246  a02 = A.a00 * B.a02 + A.a01 * B.a12 + A.a02 * B.a22;
247 
248  a10 = A.a10 * B.a00 + A.a11 * B.a10 + A.a12 * B.a20;
249  a11 = A.a10 * B.a01 + A.a11 * B.a11 + A.a12 * B.a21;
250  a12 = A.a10 * B.a02 + A.a11 * B.a12 + A.a12 * B.a22;
251 
252  a20 = A.a20 * B.a00 + A.a21 * B.a10 + A.a22 * B.a20;
253  a21 = A.a20 * B.a01 + A.a21 * B.a11 + A.a22 * B.a21;
254  a22 = A.a20 * B.a02 + A.a21 * B.a12 + A.a22 * B.a22;
255 
256  return *this;
257  }
258 
259 
260  /**
261  * Equality.
262  *
263  * \param A matrix
264  * \param eps numerical precision
265  * \return true if matrices identical; else false
266  */
267  bool equals(const JMatrix3D& A,
268  const double eps = std::numeric_limits<double>::min()) const
269  {
270  return (fabs(a00 - A.a00) <= eps &&
271  fabs(a01 - A.a01) <= eps &&
272  fabs(a02 - A.a02) <= eps &&
273  fabs(a10 - A.a10) <= eps &&
274  fabs(a11 - A.a11) <= eps &&
275  fabs(a12 - A.a12) <= eps &&
276  fabs(a20 - A.a20) <= eps &&
277  fabs(a21 - A.a21) <= eps &&
278  fabs(a22 - A.a22) <= eps);
279  }
280 
281 
282  /**
283  * Test identity.
284  *
285  * \param eps numerical precision
286  * \return true if identity matrix; else false
287  */
288  bool isIdentity(const double eps = std::numeric_limits<double>::min()) const
289  {
290  return equals(getIdentity(), eps);
291  }
292 
293 
294  /**
295  * Get determinant of matrix.
296  *
297  * \return determinant of matrix
298  */
299  double getDeterminant() const
300  {
301  double det = 0.0;
302 
303  det += a00 * (a11 * a22 - a21 * a12);
304  det -= a01 * (a10 * a22 - a20 * a12);
305  det += a02 * (a10 * a21 - a20 * a11);
306 
307  return det;
308  }
309 
310 
311  /**
312  * Transform.
313  *
314  * \param __x x value
315  * \param __y y value
316  * \param __z z value
317  */
318  void transform(double& __x, double& __y, double& __z) const
319  {
320  const double x = a00 * __x + a01 * __y + a02 * __z;
321  const double y = a10 * __x + a11 * __y + a12 * __z;
322  const double z = a20 * __x + a21 * __y + a22 * __z;
323 
324  __x = x;
325  __y = y;
326  __z = z;
327  }
328 
329 
330  /**
331  * Read matrix from input.
332  *
333  * \param in reader
334  * \param matrix matrix
335  * \return reader
336  */
337  friend inline JReader& operator>>(JReader& in, JMatrix3D& matrix)
338  {
339  in >> matrix.a00; in >> matrix.a01; in >> matrix.a02;
340  in >> matrix.a10; in >> matrix.a11; in >> matrix.a12;
341  in >> matrix.a20; in >> matrix.a21; in >> matrix.a22;
342 
343  return in;
344  }
345 
346 
347  /**
348  * Write matrix to output.
349  *
350  * \param out writer
351  * \param matrix matrix
352  * \return writer
353  */
354  friend inline JWriter& operator<<(JWriter& out, const JMatrix3D& matrix)
355  {
356  out << matrix.a00; out << matrix.a01; out << matrix.a02;
357  out << matrix.a10; out << matrix.a11; out << matrix.a12;
358  out << matrix.a20; out << matrix.a21; out << matrix.a22;
359 
360  return out;
361  }
362 
363 
364  /**
365  * Print ASCII formatted output.
366  *
367  * \param out output stream
368  * \param A matrix
369  * \return output stream
370  */
371  friend inline std::ostream& operator<<(std::ostream& out, const JMatrix3D& A)
372  {
373  using namespace std;
374 
375  const JFormat format(out, getFormat<JMatrix3D>(JFormat_t(10, 3, std::ios::fixed | std::ios::showpos)));
376 
377  out << format << A.a00 << ' ' << format << A.a01 << ' ' << format << A.a02 << endl;
378  out << format << A.a10 << ' ' << format << A.a11 << ' ' << format << A.a12 << endl;
379  out << format << A.a20 << ' ' << format << A.a21 << ' ' << format << A.a22 << endl;
380 
381  return out;
382  }
383 
384 
385  double a00, a01, a02;
386  double a10, a11, a12;
387  double a20, a21, a22;
388  };
389 }
390 
391 #endif
Interface for binary output.
Auxiliary base class for aritmetic operations of derived class types.
Definition: JMath.hh:110
static const JMatrix3D & getInstance()
Get reference to unique instance of this class object.
static const JMatrix3D & getIdentity()
Get reference to unique instance of this class object.
JMatrix3D & sub(const JMatrix3D &A)
Matrix subtraction.
JMatrix3D()
Default constructor.
3 x 3 matrix
JMatrix3D & mul(const double factor)
Scale matrix.
JMatrix3D & transpose()
Transpose.
Auxiliary class to temporarily define format specifications.
Definition: JManip.hh:632
JMatrix3D & mul(const JMatrix3D &A, const JMatrix3D &B)
Matrix multiplication.
friend std::ostream & operator<<(std::ostream &out, const JMatrix3D &A)
Print ASCII formatted output.
JMatrix3D & reset()
Set matrix to the null matrix.
bool isIdentity(const double eps=std::numeric_limits< double >::min()) const
Test identity.
Template definition of auxiliary base class for comparison of data structures.
Definition: JEquals.hh:24
friend JWriter & operator<<(JWriter &out, const JMatrix3D &matrix)
Write matrix to output.
Interface for binary input.
I/O manipulators.
JMatrix3D & div(const double factor)
Scale matrix.
bool equals(const JMatrix3D &A, const double eps=std::numeric_limits< double >::min()) const
Equality.
JMatrix3D & add(const JMatrix3D &A)
Matrix addition.
friend JReader & operator>>(JReader &in, JMatrix3D &matrix)
Read matrix from input.
double getDeterminant() const
Get determinant of matrix.
Base class for data structures with artithmetic capabilities.
JMatrix3D & setIdentity()
Set to identity matrix.
JMatrix3D & negate()
Negate matrix.
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
void transform(double &__x, double &__y, double &__z) const
Transform.
Data structure for format specifications.
Definition: JManip.hh:522
void set(const JMatrix3D &A)
Set matrix.
JMatrix3D(const double __a00, const double __a01, const double __a02, const double __a10, const double __a11, const double __a12, const double __a20, const double __a21, const double __a22)
Contructor.
source $JPP_DIR setenv csh $JPP_DIR eval JShellParser o a A