geolib2
matrix.h
Go to the documentation of this file.
1 #ifndef GEOLIB_MATRIX_H_
2 #define GEOLIB_MATRIX_H_
3 
4 #include <ostream>
5 #include <cstring>
6 #include <cmath>
7 
8 namespace geo {
9 
10 typedef double real;
11 
12 class Vector3 {
13 
14  friend class Matrix3x3;
15  friend class Transform;
16 
17 public:
18 
19  Vector3() {}
20 
22  v_[0] = x;
23  v_[1] = y;
24  v_[2] = z;
25  }
26 
27  Vector3(const real* v) {
28  memcpy(v_, v, 3 * sizeof(real));
29  }
30 
31  inline const real& x() const { return v_[0]; }
32  inline const real& y() const { return v_[1]; }
33  inline const real& z() const { return v_[2]; }
34 
35  inline const real& getX() const { return v_[0]; }
36  inline const real& getY() const { return v_[1]; }
37  inline const real& getZ() const { return v_[2]; }
38 
39  inline void setX(real x) { v_[0] = x; }
40  inline void setY(real y) { v_[1] = y; }
41  inline void setZ(real z) { v_[2] = z; }
42 
43  inline real length() const {
44  return sqrt(v_[0]*v_[0] + v_[1]*v_[1] + v_[2]*v_[2]);
45  }
46 
47  inline real length2() const {
48  return v_[0]*v_[0] + v_[1]*v_[1] + v_[2]*v_[2];
49  }
50 
51  inline void normalize() {
52  real l = length();
53  v_[0] /= l; v_[1] /= l; v_[2] /= l;
54  }
55 
56  inline real dot(const Vector3& v) const {
57  return v_[0]*v.v_[0] + v_[1]*v.v_[1] + v_[2]*v.v_[2];
58  }
59 
60  inline Vector3 operator+(const Vector3& v) const {
61  return Vector3(v_[0]+v.v_[0], v_[1]+v.v_[1], v_[2]+v.v_[2]);
62  }
63 
64  inline Vector3 operator-(const Vector3& v) const {
65  return Vector3(v_[0]-v.v_[0], v_[1]-v.v_[1], v_[2]-v.v_[2]);
66  }
67 
68  inline Vector3 operator*(real f) const {
69  return Vector3(v_[0] * f, v_[1] * f, v_[2] * f);
70  }
71 
72  inline Vector3 operator/(real f) const {
73  return Vector3(v_[0] / f, v_[1] / f, v_[2] / f);
74  }
75 
76  friend std::ostream& operator<< (std::ostream& out, const Vector3& v) {
77  out << "[ " << v.v_[0] << " " << v.v_[1] << " " << v.v_[2] << " ]";
78  return out;
79  }
80 
81  friend Vector3 operator*(real s, const Vector3& v) {
82  return v * s;
83  }
84 
85  friend Vector3 operator-(const Vector3& v) {
86  return Vector3(-v.v_[0], -v.v_[1], -v.v_[2]);
87  }
88 
89 protected:
90 
91  real v_[3];
92 };
93 
94 
95 
96 class Matrix3x3 {
97 
98  friend class Transform;
99 
100 public:
101 
103 
104  Matrix3x3(real m11, real m12, real m13,
105  real m21, real m22, real m23,
106  real m31, real m32, real m33) //:
107 // m_{m11, m12, m13, m21, m22, m23, m31, m32, m33}
108  {
109  m_[0]= m11;
110  m_[1]= m12;
111  m_[2]= m13;
112  m_[3]= m21;
113  m_[4]= m22;
114  m_[5]= m23;
115  m_[6]= m31;
116  m_[7]= m32;
117  m_[8]= m33;
118  }
119 
120  Matrix3x3(const real* m) {
121  memcpy(m_, m, 9 * sizeof(real));
122  }
123 
124  void setRPY(real roll, real pitch, real yaw) {
125  real ci = cos(roll);
126  real cj = cos(pitch);
127  real ch = cos(yaw);
128  real si = sin(roll);
129  real sj = sin(pitch);
130  real sh = sin(yaw);
131  real cc = ci * ch;
132  real cs = ci * sh;
133  real sc = si * ch;
134  real ss = si * sh;
135 
136  m_[0] = cj * ch; m_[1] = sj * sc - cs; m_[2] = sj * cc + ss;
137  m_[3] = cj * sh; m_[4] = sj * ss + cc, m_[5] = sj * cs - sc;
138  m_[6] = -sj; m_[7] = cj * si; m_[8] = cj * ci ;
139  }
140 
141  inline Vector3 getRow(int i) {
142  return Vector3(m_[i*3], m_[i*3+1], m_[i*3+2]);
143  }
144 
145  Matrix3x3 operator*(const Matrix3x3& n) const {
146  return Matrix3x3(m_[0]*n.m_[0]+m_[1]*n.m_[3]+m_[2]*n.m_[6], m_[0]*n.m_[1]+m_[1]*n.m_[4]+m_[2]*n.m_[7], m_[0]*n.m_[2]+m_[1]*n.m_[5]+m_[2]*n.m_[8],
147  m_[3]*n.m_[0]+m_[4]*n.m_[3]+m_[5]*n.m_[6], m_[3]*n.m_[1]+m_[4]*n.m_[4]+m_[5]*n.m_[7], m_[3]*n.m_[2]+m_[4]*n.m_[5]+m_[5]*n.m_[8],
148  m_[6]*n.m_[0]+m_[7]*n.m_[3]+m_[8]*n.m_[6], m_[6]*n.m_[1]+m_[7]*n.m_[4]+m_[8]*n.m_[7], m_[6]*n.m_[2]+m_[7]*n.m_[5]+m_[8]*n.m_[8]);
149  }
150 
151  Vector3 operator*(const Vector3& v) const {
152  return Vector3(m_[0]*v.v_[0]+m_[1]*v.v_[1]+m_[2]*v.v_[2],
153  m_[3]*v.v_[0]+m_[4]*v.v_[1]+m_[5]*v.v_[2],
154  m_[6]*v.v_[0]+m_[7]*v.v_[1]+m_[8]*v.v_[2]);
155  }
156 
157  friend std::ostream& operator<< (std::ostream& out, const Matrix3x3& m) {
158  out << "[ " << m.m_[0] << " " << m.m_[1] << " " << m.m_[2] << std::endl
159  << m.m_[3] << " " << m.m_[4] << " " << m.m_[5] << std::endl
160  << m.m_[6] << " " << m.m_[7] << " " << m.m_[8] << " ]";
161  return out;
162  }
163 
164 protected:
165 
166  real m_[9];
167 
168 };
169 
170 class Transform {
171 
172 public:
173 
175 
176  Transform(real x, real y, real z, real roll = 0, real pitch = 0, real yaw = 0) {
177  o_[0] = x; o_[1] = y; o_[2] = z;
178  setRPY(roll, pitch, yaw);
179  }
180 
181  Transform(real m11, real m12, real m13,
182  real m21, real m22, real m23,
183  real m31, real m32, real m33,
184  real x, real y, real z) {
185 
186  r_[0] = m11; r_[1] = m12; r_[2] = m13;
187  r_[3] = m21; r_[4] = m22; r_[5] = m23;
188  r_[6] = m31; r_[7] = m32; r_[8] = m33;
189  o_[0] = x; o_[1] = y; o_[2] = z;
190  }
191 
192  Transform(const Matrix3x3& r, const Vector3& v) {
193  memcpy(o_, v.v_, 3 * sizeof(real));
194  memcpy(r_, r.m_, 9 * sizeof(real));
195  }
196 
197  inline Vector3 operator*(const Vector3& v) const {
198  return Vector3(r_[0]*v.v_[0]+r_[1]*v.v_[1]+r_[2]*v.v_[2]+o_[0],
199  r_[3]*v.v_[0]+r_[4]*v.v_[1]+r_[5]*v.v_[2]+o_[1],
200  r_[6]*v.v_[0]+r_[7]*v.v_[1]+r_[8]*v.v_[2]+o_[2]);
201  }
202 
203  inline Transform operator*(const Transform& t) const {
204  return Transform(r_[0]*t.r_[0]+r_[1]*t.r_[3]+r_[2]*t.r_[6], r_[0]*t.r_[1]+r_[1]*t.r_[4]+r_[2]*t.r_[7], r_[0]*t.r_[2]+r_[1]*t.r_[5]+r_[2]*t.r_[8],
205  r_[3]*t.r_[0]+r_[4]*t.r_[3]+r_[5]*t.r_[6], r_[3]*t.r_[1]+r_[4]*t.r_[4]+r_[5]*t.r_[7], r_[3]*t.r_[2]+r_[4]*t.r_[5]+r_[5]*t.r_[8],
206  r_[6]*t.r_[0]+r_[7]*t.r_[3]+r_[8]*t.r_[6], r_[6]*t.r_[1]+r_[7]*t.r_[4]+r_[8]*t.r_[7], r_[6]*t.r_[2]+r_[7]*t.r_[5]+r_[8]*t.r_[8],
207 
208  r_[0]*t.o_[0]+r_[1]*t.o_[1]+r_[2]*t.o_[2]+o_[0],
209  r_[3]*t.o_[0]+r_[4]*t.o_[1]+r_[5]*t.o_[2]+o_[1],
210  r_[6]*t.o_[0]+r_[7]*t.o_[1]+r_[8]*t.o_[2]+o_[2]);
211  }
212 
213  inline Vector3 getOrigin() const {
214  return Vector3(o_);
215  }
216 
217  inline Matrix3x3 getBasis() const {
218  return Matrix3x3(r_);
219  }
220 
221  inline Transform inverse() const {
222  return Transform(r_[0], r_[3], r_[6],
223  r_[1], r_[4], r_[7],
224  r_[2], r_[5], r_[8],
225 
226  -r_[0]*o_[0]-r_[3]*o_[1]-r_[6]*o_[2],
227  -r_[1]*o_[0]-r_[4]*o_[1]-r_[7]*o_[2],
228  -r_[2]*o_[0]-r_[5]*o_[1]-r_[8]*o_[2]);
229  }
230 
231  void setRPY(real roll, real pitch, real yaw) {
232  real ci = cos(roll);
233  real cj = cos(pitch);
234  real ch = cos(yaw);
235  real si = sin(roll);
236  real sj = sin(pitch);
237  real sh = sin(yaw);
238  real cc = ci * ch;
239  real cs = ci * sh;
240  real sc = si * ch;
241  real ss = si * sh;
242 
243  r_[0] = cj * ch; r_[1] = sj * sc - cs; r_[2] = sj * cc + ss;
244  r_[3] = cj * sh; r_[4] = sj * ss + cc, r_[5] = sj * cs - sc;
245  r_[6] = -sj; r_[7] = cj * si; r_[8] = cj * ci ;
246  }
247 
248  friend std::ostream& operator<< (std::ostream& out, const Transform& t) {
249  out << "[ " << t.r_[0] << " " << t.r_[1] << " " << t.r_[2] << " [ " << t.o_[0] << " ]" << std::endl
250  << t.r_[3] << " " << t.r_[4] << " " << t.r_[5] << " [ " << t.o_[1] << " ]" << std::endl
251  << t.r_[6] << " " << t.r_[7] << " " << t.r_[8] << " ] [ " << t.o_[2] << " ]";
252  return out;
253  }
254 
255 protected:
256 
257  real o_[3];
258  real r_[9];
259 
260 };
261 
262 }
263 
264 #endif
geo::Vector3::y
const real & y() const
Definition: matrix.h:32
geo::Vector3
Vec3 Vector3
Definition: datatypes.h:32
geo::Matrix3x3::operator*
Vector3 operator*(const Vector3 &v) const
Definition: matrix.h:151
geo::Transform::Transform
Transform(real m11, real m12, real m13, real m21, real m22, real m23, real m31, real m32, real m33, real x, real y, real z)
Definition: matrix.h:181
geo::Vector3::Vector3
Vector3(const real *v)
Definition: matrix.h:27
geo::Transform::Transform
Transform(const Matrix3x3 &r, const Vector3 &v)
Definition: matrix.h:192
geo::real
double real
Definition: math_types.h:9
geo::Vector3::operator*
Vector3 operator*(real f) const
Definition: matrix.h:68
cstring
geo
Definition: Box.h:6
geo::Transform::Transform
Transform()
Definition: matrix.h:174
t
Timer t
geo::Matrix3x3::operator<<
friend std::ostream & operator<<(std::ostream &out, const Matrix3x3 &m)
Definition: matrix.h:157
geo::Matrix3x3
Definition: matrix.h:96
geo::Vector3::getY
const real & getY() const
Definition: matrix.h:36
geo::Matrix3x3::Matrix3x3
Matrix3x3()
Definition: matrix.h:102
geo::Vector3::v_
real v_[3]
Definition: matrix.h:91
geo::Transform::getOrigin
Vector3 getOrigin() const
Definition: matrix.h:213
geo::Vector3::setY
void setY(real y)
Definition: matrix.h:40
geo::Vector3::Vector3
Vector3()
Definition: matrix.h:19
geo::Vector3::length
real length() const
Definition: matrix.h:43
cmath
geo::Vector3::getZ
const real & getZ() const
Definition: matrix.h:37
geo::Transform::operator*
Transform operator*(const Transform &t) const
Definition: matrix.h:203
geo::Vector3::setX
void setX(real x)
Definition: matrix.h:39
geo::Matrix3x3::setRPY
void setRPY(real roll, real pitch, real yaw)
Definition: matrix.h:124
geo::Vector3::setZ
void setZ(real z)
Definition: matrix.h:41
geo::Vector3::operator-
friend Vector3 operator-(const Vector3 &v)
Definition: matrix.h:85
geo::Vector3::dot
real dot(const Vector3 &v) const
Definition: matrix.h:56
std::ostream
geo::Vector3::operator/
Vector3 operator/(real f) const
Definition: matrix.h:72
geo::Vector3::Vector3
Vector3(real x, real y, real z)
Definition: matrix.h:21
geo::Transform
Definition: matrix.h:170
geo::Transform::operator<<
friend std::ostream & operator<<(std::ostream &out, const Transform &t)
Definition: matrix.h:248
geo::Vector3
Definition: matrix.h:12
geo::Vector3::operator-
Vector3 operator-(const Vector3 &v) const
Definition: matrix.h:64
geo::Vector3::normalize
void normalize()
Definition: matrix.h:51
geo::Transform::r_
real r_[9]
Definition: matrix.h:258
geo::Transform::Transform
Transform(real x, real y, real z, real roll=0, real pitch=0, real yaw=0)
Definition: matrix.h:176
geo::Vector3::z
const real & z() const
Definition: matrix.h:33
geo::Transform::getBasis
Matrix3x3 getBasis() const
Definition: matrix.h:217
geo::Matrix3x3::operator*
Matrix3x3 operator*(const Matrix3x3 &n) const
Definition: matrix.h:145
geo::Matrix3x3::Matrix3x3
Matrix3x3(const real *m)
Definition: matrix.h:120
std::endl
T endl(T... args)
geo::Vector3::operator+
Vector3 operator+(const Vector3 &v) const
Definition: matrix.h:60
geo::Matrix3x3::Matrix3x3
Matrix3x3(real m11, real m12, real m13, real m21, real m22, real m23, real m31, real m32, real m33)
Definition: matrix.h:104
geo::Vector3::x
const real & x() const
Definition: matrix.h:31
geo::Vector3::length2
real length2() const
Definition: matrix.h:47
geo::Matrix3x3::m_
real m_[9]
Definition: matrix.h:166
geo::Matrix3x3::getRow
Vector3 getRow(int i)
Definition: matrix.h:141
geo::Vector3::operator*
friend Vector3 operator*(real s, const Vector3 &v)
Definition: matrix.h:81
geo::Vector3::operator<<
friend std::ostream & operator<<(std::ostream &out, const Vector3 &v)
Definition: matrix.h:76
ostream
geo::Transform::setRPY
void setRPY(real roll, real pitch, real yaw)
Definition: matrix.h:231
geo::Transform::inverse
Transform inverse() const
Definition: matrix.h:221
geo::Transform::o_
real o_[3]
Definition: matrix.h:257
geo::Vector3::getX
const real & getX() const
Definition: matrix.h:35
geo::Transform::operator*
Vector3 operator*(const Vector3 &v) const
Definition: matrix.h:197