OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
Matrix3D.cpp
Go to the documentation of this file.
1// ------------------------------------------------------------------------
2// $RCSfile: Matrix3D.cpp,v $
3// ------------------------------------------------------------------------
4// $Revision: 1.1.1.1 $
5// ------------------------------------------------------------------------
6// Copyright: see Copyright.readme
7// ------------------------------------------------------------------------
8//
9// Class: Matrix3D
10// Matrix3D represents an 3-dimension matrix.
11//
12// ------------------------------------------------------------------------
13// Class category: BeamlineGeometry
14// ------------------------------------------------------------------------
15//
16// $Date: 2000/03/27 09:32:34 $
17// $Author: fci $
18//
19// ------------------------------------------------------------------------
20
23
24// Class Matrix3D.
25// ------------------------------------------------------------------------
26
27Matrix3D::Matrix3D(const Vector3D& a, const Vector3D& b, const Vector3D& c) {
28 m[0][0] = a(0);
29 m[0][1] = b(0);
30 m[0][2] = c(0);
31 m[1][0] = a(1);
32 m[1][1] = b(1);
33 m[1][2] = c(1);
34 m[2][0] = a(2);
35 m[2][1] = b(2);
36 m[2][2] = c(2);
37}
38
40 double x11, double x12, double x13, double x21, double x22, double x23, double x31,
41 double x32, double x33) {
42 m[0][0] = x11;
43 m[0][1] = x12;
44 m[0][2] = x13;
45 m[1][0] = x21;
46 m[1][1] = x22;
47 m[1][2] = x23;
48 m[2][0] = x31;
49 m[2][1] = x32;
50 m[2][2] = x33;
51}
52
53bool Matrix3D::operator==(const Matrix3D& rhs) const {
54 return (m[0][0] == rhs(0, 0)) && (m[0][1] == rhs(0, 1)) && (m[0][2] == rhs(0, 2))
55 && (m[1][0] == rhs(1, 0)) && (m[1][1] == rhs(1, 1)) && (m[1][2] == rhs(1, 2))
56 && (m[2][0] == rhs(2, 0)) && (m[2][1] == rhs(2, 1)) && (m[2][2] == rhs(2, 2));
57}
58
59bool Matrix3D::operator!=(const Matrix3D& rhs) const {
60 return (m[0][0] != rhs(0, 0)) || (m[0][1] != rhs(0, 1)) || (m[0][2] != rhs(0, 2))
61 || (m[1][0] != rhs(1, 0)) || (m[1][1] != rhs(1, 1)) || (m[1][2] != rhs(1, 2))
62 || (m[2][0] != rhs(2, 0)) || (m[2][1] != rhs(2, 1)) || (m[2][2] != rhs(2, 2));
63}
64
66 m[0][0] += rhs.m[0][0];
67 m[0][1] += rhs.m[0][1];
68 m[0][2] += rhs.m[0][2];
69 m[1][0] += rhs.m[1][0];
70 m[1][1] += rhs.m[1][1];
71 m[1][2] += rhs.m[1][2];
72 m[2][0] += rhs.m[2][0];
73 m[2][1] += rhs.m[2][1];
74 m[2][2] += rhs.m[2][2];
75 return *this;
76}
77
79 m[0][0] -= rhs.m[0][0];
80 m[0][1] -= rhs.m[0][1];
81 m[0][2] -= rhs.m[0][2];
82 m[1][0] -= rhs.m[1][0];
83 m[1][1] -= rhs.m[1][1];
84 m[1][2] -= rhs.m[1][2];
85 m[2][0] -= rhs.m[2][0];
86 m[2][1] -= rhs.m[2][1];
87 m[2][2] -= rhs.m[2][2];
88 return *this;
89}
90
91Matrix3D& Matrix3D::operator*=(const Matrix3D& rhs) { return (*this = *this * rhs); }
92
94 m[0][0] *= rhs;
95 m[0][1] *= rhs;
96 m[0][2] *= rhs;
97 m[1][0] *= rhs;
98 m[1][1] *= rhs;
99 m[1][2] *= rhs;
100 m[2][0] *= rhs;
101 m[2][1] *= rhs;
102 m[2][2] *= rhs;
103 return *this;
104}
105
107
109 return (m[0][0] == 1.0) && (m[0][1] == 0.0) && (m[0][2] == 0.0) && (m[1][0] == 0.0)
110 && (m[1][1] == 1.0) && (m[1][2] == 0.0) && (m[2][0] == 0.0) && (m[2][1] == 0.0)
111 && (m[2][2] == 1.0);
112}
113
115 double det = m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1])
116 + m[0][1] * (m[1][2] * m[2][0] - m[1][0] * m[2][2])
117 + m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);
118
119 return Matrix3D(
120 (m[1][1] * m[2][2] - m[1][2] * m[2][1]) / det,
121 (m[2][1] * m[0][2] - m[2][2] * m[0][1]) / det,
122 (m[0][1] * m[1][2] - m[0][2] * m[1][1]) / det,
123
124 (m[1][2] * m[2][0] - m[1][0] * m[2][2]) / det,
125 (m[2][2] * m[0][0] - m[2][0] * m[0][2]) / det,
126 (m[0][2] * m[1][0] - m[0][0] * m[1][2]) / det,
127
128 (m[1][0] * m[2][1] - m[1][1] * m[2][0]) / det,
129 (m[2][0] * m[0][1] - m[2][1] * m[0][0]) / det,
130 (m[0][0] * m[1][1] - m[0][1] * m[1][0]) / det);
131}
132
134 Matrix3D t;
135
136 for (int i = 0; i < 3; i++) {
137 t(i, 0) = m[0][i];
138 t(i, 1) = m[1][i];
139 t(i, 2) = m[2][i];
140 }
141
142 return t;
143}
144
145Matrix3D operator+(const Matrix3D& lhs, const Matrix3D& rhs) {
146 Matrix3D result(lhs);
147 return result += rhs;
148}
149
150Matrix3D operator-(const Matrix3D& lhs, const Matrix3D& rhs) {
151 Matrix3D result(lhs);
152 return result += rhs;
153}
154
155Matrix3D operator*(const Matrix3D& lhs, const Matrix3D& rhs) {
156 return Matrix3D(
157 lhs(0, 0) * rhs(0, 0) + lhs(0, 1) * rhs(1, 0) + lhs(0, 2) * rhs(2, 0),
158 lhs(0, 0) * rhs(0, 1) + lhs(0, 1) * rhs(1, 1) + lhs(0, 2) * rhs(2, 1),
159 lhs(0, 0) * rhs(0, 2) + lhs(0, 1) * rhs(1, 2) + lhs(0, 2) * rhs(2, 2),
160
161 lhs(1, 0) * rhs(0, 0) + lhs(1, 1) * rhs(1, 0) + lhs(1, 2) * rhs(2, 0),
162 lhs(1, 0) * rhs(0, 1) + lhs(1, 1) * rhs(1, 1) + lhs(1, 2) * rhs(2, 1),
163 lhs(1, 0) * rhs(0, 2) + lhs(1, 1) * rhs(1, 2) + lhs(1, 2) * rhs(2, 2),
164
165 lhs(2, 0) * rhs(0, 0) + lhs(2, 1) * rhs(1, 0) + lhs(2, 2) * rhs(2, 0),
166 lhs(2, 0) * rhs(0, 1) + lhs(2, 1) * rhs(1, 1) + lhs(2, 2) * rhs(2, 1),
167 lhs(2, 0) * rhs(0, 2) + lhs(2, 1) * rhs(1, 2) + lhs(2, 2) * rhs(2, 2));
168}
169
170Vector3D operator*(const Matrix3D& lhs, const Vector3D& rhs) {
171 return Vector3D(
172 lhs(0, 0) * rhs(0) + lhs(0, 1) * rhs(1) + lhs(0, 2) * rhs(2),
173 lhs(1, 0) * rhs(0) + lhs(1, 1) * rhs(1) + lhs(1, 2) * rhs(2),
174 lhs(2, 0) * rhs(0) + lhs(2, 1) * rhs(1) + lhs(2, 2) * rhs(2));
175}
Matrix3D operator*(const Matrix3D &lhs, const Matrix3D &rhs)
Multiply.
Definition Matrix3D.cpp:155
Matrix3D operator+(const Matrix3D &lhs, const Matrix3D &rhs)
Add.
Definition Matrix3D.cpp:145
Matrix3D operator-(const Matrix3D &lhs, const Matrix3D &rhs)
Subtract.
Definition Matrix3D.cpp:150
3-dimensional matrix.
Definition Matrix3D.h:32
Matrix3D transpose() const
Transpose.
Definition Matrix3D.cpp:133
Matrix3D & operator-=(const Matrix3D &rhs)
Subtract and assign.
Definition Matrix3D.cpp:78
Matrix3D & operator+=(const Matrix3D &rhs)
Add and assign.
Definition Matrix3D.cpp:65
bool isIdentity() const
Test for identity.
Definition Matrix3D.cpp:108
Matrix3D & operator*=(const Matrix3D &rhs)
Multiply and assign.
Definition Matrix3D.cpp:91
bool operator!=(const Matrix3D &) const
Definition Matrix3D.cpp:59
Matrix3D inverse() const
Inverse.
Definition Matrix3D.cpp:114
bool operator==(const Matrix3D &) const
Definition Matrix3D.cpp:53
double m[3][3]
Definition Matrix3D.h:86
static Matrix3D Identity()
Make identity.
Definition Matrix3D.cpp:106
Matrix3D()
Default constructor.
Definition Matrix3D.h:107
A 3-dimension vector.
Definition Vector3D.h:30