17 #ifndef IGNITION_MATH_MATRIX3_HH_ 18 #define IGNITION_MATH_MATRIX3_HH_ 25 #include <ignition/math/config.hh> 32 inline namespace IGNITION_MATH_VERSION_NAMESPACE {
50 std::memset(this->data, 0,
sizeof(this->data[0][0])*9);
57 std::memcpy(this->data, _m.data,
sizeof(this->data[0][0])*9);
71 T _v10, T _v11, T _v12,
72 T _v20, T _v21, T _v22)
74 this->data[0][0] = _v00;
75 this->data[0][1] = _v01;
76 this->data[0][2] = _v02;
77 this->data[1][0] = _v10;
78 this->data[1][1] = _v11;
79 this->data[1][2] = _v12;
80 this->data[2][0] = _v20;
81 this->data[2][1] = _v21;
82 this->data[2][2] = _v22;
91 this->Set(1 - 2*qt.
Y()*qt.
Y() - 2 *qt.
Z()*qt.
Z(),
92 2 * qt.
X()*qt.
Y() - 2*qt.
Z()*qt.
W(),
93 2 * qt.
X() * qt.
Z() + 2 * qt.
Y() * qt.
W(),
94 2 * qt.
X() * qt.
Y() + 2 * qt.
Z() * qt.
W(),
95 1 - 2*qt.
X()*qt.
X() - 2 * qt.
Z()*qt.
Z(),
96 2 * qt.
Y() * qt.
Z() - 2 * qt.
X() * qt.
W(),
97 2 * qt.
X() * qt.
Z() - 2 * qt.
Y() * qt.
W(),
98 2 * qt.
Y() * qt.
Z() + 2 * qt.
X() * qt.
W(),
99 1 - 2 * qt.
X()*qt.
X() - 2 * qt.
Y()*qt.
Y());
115 public:
void Set(T _v00, T _v01, T _v02,
116 T _v10, T _v11, T _v12,
117 T _v20, T _v21, T _v22)
119 this->data[0][0] = _v00;
120 this->data[0][1] = _v01;
121 this->data[0][2] = _v02;
122 this->data[1][0] = _v10;
123 this->data[1][1] = _v11;
124 this->data[1][2] = _v12;
125 this->data[2][0] = _v20;
126 this->data[2][1] = _v21;
127 this->data[2][2] = _v22;
138 this->Col(0, _xAxis);
139 this->Col(1, _yAxis);
140 this->Col(2, _zAxis);
152 this->data[0][0] = _axis.
X()*_axis.
X()*C + c;
153 this->data[0][1] = _axis.
X()*_axis.
Y()*C - _axis.
Z()*s;
154 this->data[0][2] = _axis.
X()*_axis.
Z()*C + _axis.
Y()*s;
156 this->data[1][0] = _axis.
Y()*_axis.
X()*C + _axis.
Z()*s;
157 this->data[1][1] = _axis.
Y()*_axis.
Y()*C + c;
158 this->data[1][2] = _axis.
Y()*_axis.
Z()*C - _axis.
X()*s;
160 this->data[2][0] = _axis.
Z()*_axis.
X()*C - _axis.
Y()*s;
161 this->data[2][1] = _axis.
Z()*_axis.
Y()*C + _axis.
X()*s;
162 this->data[2][2] = _axis.
Z()*_axis.
Z()*C + c;
174 if (_v1LengthSquared <= 0.0)
177 this->Set(1, 0, 0, 0, 1, 0, 0, 0, 1);
182 if (_v2LengthSquared <= 0.0)
185 this->Set(1, 0, 0, 0, 1, 0, 0, 0, 1);
189 const T dot = _v1.
Dot(_v2) / sqrt(_v1LengthSquared * _v2LengthSquared);
190 if (fabs(dot - 1.0) <= 1e-6)
193 this->Set(1, 0, 0, 0, 1, 0, 0, 0, 1);
196 else if (fabs(dot + 1.0) <= 1e-6)
199 this->Set(-1, 0, 0, 0, -1, 0, 0, 0, -1);
205 this->Axis(cross, acos(dot));
214 unsigned int c =
clamp(_c, 0u, 2u);
216 this->data[0][c] = _v.
X();
217 this->data[1][c] = _v.
Y();
218 this->data[2][c] = _v.
Z();
226 memcpy(this->data, _mat.data,
sizeof(this->data[0][0])*9);
234 this->data[0][0] - _m(0, 0),
235 this->data[0][1] - _m(0, 1),
236 this->data[0][2] - _m(0, 2),
237 this->data[1][0] - _m(1, 0),
238 this->data[1][1] - _m(1, 1),
239 this->data[1][2] - _m(1, 2),
240 this->data[2][0] - _m(2, 0),
241 this->data[2][1] - _m(2, 1),
242 this->data[2][2] - _m(2, 2));
249 this->data[0][0]+_m(0, 0),
250 this->data[0][1]+_m(0, 1),
251 this->data[0][2]+_m(0, 2),
252 this->data[1][0]+_m(1, 0),
253 this->data[1][1]+_m(1, 1),
254 this->data[1][2]+_m(1, 2),
255 this->data[2][0]+_m(2, 0),
256 this->data[2][1]+_m(2, 1),
257 this->data[2][2]+_m(2, 2));
264 _s * this->data[0][0], _s * this->data[0][1], _s * this->data[0][2],
265 _s * this->data[1][0], _s * this->data[1][1], _s * this->data[1][2],
266 _s * this->data[2][0], _s * this->data[2][1], _s * this->data[2][2]);
276 this->data[0][0]*_m(0, 0)+
277 this->data[0][1]*_m(1, 0)+
278 this->data[0][2]*_m(2, 0),
280 this->data[0][0]*_m(0, 1)+
281 this->data[0][1]*_m(1, 1)+
282 this->data[0][2]*_m(2, 1),
284 this->data[0][0]*_m(0, 2)+
285 this->data[0][1]*_m(1, 2)+
286 this->data[0][2]*_m(2, 2),
289 this->data[1][0]*_m(0, 0)+
290 this->data[1][1]*_m(1, 0)+
291 this->data[1][2]*_m(2, 0),
293 this->data[1][0]*_m(0, 1)+
294 this->data[1][1]*_m(1, 1)+
295 this->data[1][2]*_m(2, 1),
297 this->data[1][0]*_m(0, 2)+
298 this->data[1][1]*_m(1, 2)+
299 this->data[1][2]*_m(2, 2),
302 this->data[2][0]*_m(0, 0)+
303 this->data[2][1]*_m(1, 0)+
304 this->data[2][2]*_m(2, 0),
306 this->data[2][0]*_m(0, 1)+
307 this->data[2][1]*_m(1, 1)+
308 this->data[2][2]*_m(2, 1),
310 this->data[2][0]*_m(0, 2)+
311 this->data[2][1]*_m(1, 2)+
312 this->data[2][2]*_m(2, 2));
322 this->data[0][0]*_vec.
X() + this->data[0][1]*_vec.
Y() +
323 this->data[0][2]*_vec.
Z(),
324 this->data[1][0]*_vec.
X() + this->data[1][1]*_vec.
Y() +
325 this->data[1][2]*_vec.
Z(),
326 this->data[2][0]*_vec.
X() + this->data[2][1]*_vec.
Y() +
327 this->data[2][2]*_vec.
Z());
349 _m(0, 0)*_v.
X() + _m(1, 0)*_v.
Y() + _m(2, 0)*_v.
Z(),
350 _m(0, 1)*_v.
X() + _m(1, 1)*_v.
Y() + _m(2, 1)*_v.
Z(),
351 _m(0, 2)*_v.
X() + _m(1, 2)*_v.
Y() + _m(2, 2)*_v.
Z());
361 return equal<T>(this->data[0][0], _m(0, 0), _tol)
362 && equal<T>(this->data[0][1], _m(0, 1), _tol)
363 && equal<T>(this->data[0][2], _m(0, 2), _tol)
364 && equal<T>(this->data[1][0], _m(1, 0), _tol)
365 && equal<T>(this->data[1][1], _m(1, 1), _tol)
366 && equal<T>(this->data[1][2], _m(1, 2), _tol)
367 && equal<T>(this->data[2][0], _m(2, 0), _tol)
368 && equal<T>(this->data[2][1], _m(2, 1), _tol)
369 && equal<T>(this->data[2][2], _m(2, 2), _tol);
377 return this->Equal(_m, static_cast<T>(1e-6));
393 return !(*
this == _m);
400 public:
inline const T &
operator()(
size_t _row,
size_t _col)
const 420 T t0 = this->data[2][2]*this->data[1][1]
421 - this->data[2][1]*this->data[1][2];
423 T t1 = -(this->data[2][2]*this->data[1][0]
424 -this->data[2][0]*this->data[1][2]);
426 T t2 = this->data[2][1]*this->data[1][0]
427 - this->data[2][0]*this->data[1][1];
429 return t0 * this->data[0][0]
430 + t1 * this->data[0][1]
431 + t2 * this->data[0][2];
438 T t0 = this->data[2][2]*this->data[1][1] -
439 this->data[2][1]*this->data[1][2];
441 T t1 = -(this->data[2][2]*this->data[1][0] -
442 this->data[2][0]*this->data[1][2]);
444 T t2 = this->data[2][1]*this->data[1][0] -
445 this->data[2][0]*this->data[1][1];
447 T invDet = 1.0 / (t0 * this->data[0][0] +
448 t1 * this->data[0][1] +
449 t2 * this->data[0][2]);
453 - (this->data[2][2] * this->data[0][1] -
454 this->data[2][1] * this->data[0][2]),
455 + (this->data[1][2] * this->data[0][1] -
456 this->data[1][1] * this->data[0][2]),
458 + (this->data[2][2] * this->data[0][0] -
459 this->data[2][0] * this->data[0][2]),
460 - (this->data[1][2] * this->data[0][0] -
461 this->data[1][0] * this->data[0][2]),
463 - (this->data[2][1] * this->data[0][0] -
464 this->data[2][0] * this->data[0][1]),
465 + (this->data[1][1] * this->data[0][0] -
466 this->data[1][0] * this->data[0][1]));
472 std::swap(this->data[0][1], this->data[1][0]);
473 std::swap(this->data[0][2], this->data[2][0]);
474 std::swap(this->data[1][2], this->data[2][1]);
482 this->data[0][0], this->data[1][0], this->data[2][0],
483 this->data[0][1], this->data[1][1], this->data[2][1],
484 this->data[0][2], this->data[1][2], this->data[2][2]);
514 _in.
setf(std::ios_base::skipws);
516 _in >> d[0] >> d[1] >> d[2]
517 >> d[3] >> d[4] >> d[5]
518 >> d[6] >> d[7] >> d[8];
520 _m.
Set(d[0], d[1], d[2],
527 private: T data[3][3];
friend std::istream & operator>>(std::istream &_in, Matrix3< T > &_m)
Stream extraction operator.
Definition: Matrix3.hh:510
void Axes(const Vector3< T > &_xAxis, const Vector3< T > &_yAxis, const Vector3< T > &_zAxis)
Set the matrix from three axis (1 per column)
Definition: Matrix3.hh:134
const T & W() const
Get the w component.
Definition: Quaternion.hh:949
bool operator==(const Matrix3< T > &_m) const
Equality test operator.
Definition: Matrix3.hh:375
static const Matrix3< T > Identity
Identity matrix.
Definition: Matrix3.hh:42
const T & Z() const
Get the z component.
Definition: Quaternion.hh:970
T precision(const T &_a, const unsigned int &_precision)
get value at a specified precision
Definition: Helpers.hh:580
static const static double const static double const static double const static double const static float const static float const static float const static float const static uint16_t const static uint16_t const static uint16_t const static uint16_t const static int16_t const static int16_t const static int16_t const static int16_t const static uint32_t const static uint32_t const static uint32_t const static uint32_t const static int32_t const static int32_t const static int32_t const static int32_t const static uint64_t const static uint64_t const static uint64_t const static uint64_t const static int64_t const static int64_t const static int64_t const int64_t T clamp(T _v, T _min, T _max)
Simple clamping function.
Definition: Helpers.hh:396
void Normalize()
Normalize the quaternion.
Definition: Quaternion.hh:224
void Col(unsigned int _c, const Vector3< T > &_v)
Set a column.
Definition: Matrix3.hh:212
Matrix3(T _v00, T _v01, T _v02, T _v10, T _v11, T _v12, T _v20, T _v21, T _v22)
Constructor.
Definition: Matrix3.hh:70
void Transpose()
Transpose this matrix.
Definition: Matrix3.hh:470
Matrix3(const Matrix3< T > &_m)
Copy constructor.
Definition: Matrix3.hh:55
friend Vector3< T > operator*(const Vector3< T > &_v, const Matrix3< T > &_m)
Matrix left multiplication operator for Vector3. Treats the Vector3 like a row vector multiplying the...
Definition: Matrix3.hh:345
Matrix3< double > Matrix3d
Definition: Matrix3.hh:543
Matrix3()
Constructor.
Definition: Matrix3.hh:48
bool Equal(const Matrix3 &_m, const T &_tol) const
Equality test with tolerance.
Definition: Matrix3.hh:359
const T & X() const
Get the x component.
Definition: Quaternion.hh:956
const T & Y() const
Get the y component.
Definition: Quaternion.hh:963
T X() const
Get the x value.
Definition: Vector3.hh:648
T Z() const
Get the z value.
Definition: Vector3.hh:662
Matrix3< T > operator*(const T &_s) const
returns the element wise scalar multiplication
Definition: Matrix3.hh:261
T Y() const
Get the y value.
Definition: Vector3.hh:655
friend Matrix3< T > operator*(T _s, const Matrix3< T > &_m)
Matrix multiplication operator for scaling.
Definition: Matrix3.hh:334
bool operator!=(const Matrix3< T > &_m) const
Inequality test operator.
Definition: Matrix3.hh:391
A 3x3 matrix class.
Definition: Matrix3.hh:39
T Dot(const Vector3< T > &_v) const
Return the dot product of this vector and another vector.
Definition: Vector3.hh:199
Vector3 Cross(const Vector3< T > &_v) const
Return the cross product of this vector with another vector.
Definition: Vector3.hh:189
Matrix3< T > operator-(const Matrix3< T > &_m) const
returns the element wise difference of two matrices
Definition: Matrix3.hh:231
static const size_t IGN_ZERO_SIZE_T
size_t type with a value of 0
Definition: Helpers.hh:217
void From2Axes(const Vector3< T > &_v1, const Vector3< T > &_v2)
Set the matrix to represent rotation from vector _v1 to vector _v2, so that _v2.Normalize() == this *...
Definition: Matrix3.hh:171
void Set(T _v00, T _v01, T _v02, T _v10, T _v11, T _v12, T _v20, T _v21, T _v22)
Set values.
Definition: Matrix3.hh:115
Matrix3< T > operator*(const Matrix3< T > &_m) const
Matrix multiplication operator.
Definition: Matrix3.hh:272
Vector3< T > operator*(const Vector3< T > &_vec) const
Multiplication operator with Vector3 on the right treated like a column vector.
Definition: Matrix3.hh:319
Matrix3< int > Matrix3i
Definition: Matrix3.hh:542
friend std::ostream & operator<<(std::ostream &_out, const Matrix3< T > &_m)
Stream insertion operator.
Definition: Matrix3.hh:491
T SquaredLength() const
Return the square of the length (magnitude) of the vector.
Definition: Vector3.hh:124
const T & operator()(size_t _row, size_t _col) const
Array subscript operator.
Definition: Matrix3.hh:400
Matrix3< T > Inverse() const
Return the inverse matrix.
Definition: Matrix3.hh:436
The Vector3 class represents the generic vector containing 3 elements. Since it's commonly used to ke...
Definition: Vector3.hh:40
Matrix3(const Quaternion< T > &_q)
Construct Matrix3 from a quaternion.
Definition: Matrix3.hh:87
T Determinant() const
Return the determinant of the matrix.
Definition: Matrix3.hh:418
Matrix3< T > Transposed() const
Return the transpose of this matrix.
Definition: Matrix3.hh:479
static const size_t IGN_TWO_SIZE_T
size_t type with a value of 2
Definition: Helpers.hh:223
Matrix3< T > & operator=(const Matrix3< T > &_mat)
Equal operator. this = _mat.
Definition: Matrix3.hh:224
static const Matrix3< T > Zero
Zero matrix.
Definition: Matrix3.hh:45
Matrix3< T > operator+(const Matrix3< T > &_m) const
returns the element wise sum of two matrices
Definition: Matrix3.hh:246
A quaternion class.
Definition: Matrix3.hh:34
Matrix3< T > & operator=(const Quaternion< T > &_q)
Set the matrix3 from a quaternion.
Definition: Matrix3.hh:383
Matrix3< float > Matrix3f
Definition: Matrix3.hh:544
virtual ~Matrix3()
Desctructor.
Definition: Matrix3.hh:103
void Axis(const Vector3< T > &_axis, T _angle)
Set the matrix from an axis and angle.
Definition: Matrix3.hh:146
T & operator()(size_t _row, size_t _col)
Array subscript operator.
Definition: Matrix3.hh:410