Jpp 19.3.0-rc.3
the software that should make you happy
Loading...
Searching...
No Matches
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
10#include "JLang/JEquals.hh"
11#include "JLang/JManip.hh"
12#include "JMath/JMath.hh"
13
14
15/**
16 * \author mdejong
17 */
18
19namespace JMATH {}
20namespace JPP { using namespace JMATH; }
21
22namespace 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
38 using JMath<JMatrix3D>::mul;
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
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.
JMatrix3D()
Default constructor.
JMatrix3D & add(const JMatrix3D &A)
Matrix addition.
static const JMatrix3D & getIdentity()
Get reference to unique instance of this class object.
JMatrix3D & negate()
Negate matrix.
void set(const JMatrix3D &A)
Set matrix.
friend std::ostream & operator<<(std::ostream &out, const JMatrix3D &A)
Print ASCII formatted output.
double getDeterminant() const
Get determinant of matrix.
JMatrix3D & mul(const double factor)
Scale matrix.
friend JReader & operator>>(JReader &in, JMatrix3D &matrix)
Read matrix from input.
JMatrix3D & transpose()
Transpose.
JMatrix3D & reset()
Set matrix to the null 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.
JMatrix3D & setIdentity()
Set to identity matrix.
void transform(double &__x, double &__y, double &__z) const
Transform.
bool isIdentity(const double eps=std::numeric_limits< double >::min()) const
Test identity.
JMatrix3D & sub(const JMatrix3D &A)
Matrix subtraction.
static const JMatrix3D & getInstance()
Get reference to unique instance of this class object.
JMatrix3D & mul(const JMatrix3D &A, const JMatrix3D &B)
Matrix multiplication.
JMatrix3D & div(const double factor)
Scale matrix.
bool equals(const JMatrix3D &A, const double eps=std::numeric_limits< double >::min()) const
Equality.
friend JWriter & operator<<(JWriter &out, const JMatrix3D &matrix)
Write matrix to output.
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