| tf2
    master
    tf2 maintains the relationship between coordinate frames in a tree structure buffered in time, and lets the user transform points, vectors, etc between any two coordinate frames at any desired point in time. | 
 
 
 
Go to the documentation of this file.
   16 #ifndef TF2_MATRIX3x3_H 
   17 #define TF2_MATRIX3x3_H 
   28 #define Matrix3x3Data   Matrix3x3DoubleData  
   68         m_el[0] = other.m_el[0];
 
   69         m_el[1] = other.m_el[1];
 
   70         m_el[2] = other.m_el[2];
 
   77         m_el[0] = other.m_el[0];
 
   78         m_el[1] = other.m_el[1];
 
   79         m_el[2] = other.m_el[2];
 
   88         return Vector3(m_el[0][i],m_el[1][i],m_el[2][i]);
 
  127         m_el[0].setValue(m[0],m[4],m[8]);
 
  128         m_el[1].setValue(m[1],m[5],m[9]);
 
  129         m_el[2].setValue(m[2],m[6],m[10]);
 
  147         m_el[0].setValue(xx,xy,xz);
 
  148         m_el[1].setValue(yx,yy,yz);
 
  149         m_el[2].setValue(zx,zy,zz);
 
  160         tf2Scalar xs = q.x() * s,   ys = q.y() * s,   zs = q.z() * s;
 
  161         tf2Scalar wx = q.w() * xs,  wy = q.w() * ys,  wz = q.w() * zs;
 
  162         tf2Scalar xx = q.x() * xs,  xy = q.x() * ys,  xz = q.x() * zs;
 
  163         tf2Scalar yy = q.y() * ys,  yz = q.y() * zs,  zz = q.z() * zs;
 
  165             xy + wz, 
tf2Scalar(1.0) - (xx + zz), yz - wx,
 
  166             xz - wy, yz + wx, 
tf2Scalar(1.0) - (xx + yy));
 
  191         setValue(cj * ch, sj * sc - cs, sj * cc + ss,
 
  192             cj * sh, sj * ss + cc, sj * cs - sc, 
 
  193             -sj,      cj * si,      cj * ci);
 
  222         return identityMatrix;
 
  249         tf2Scalar trace = m_el[0].x() + m_el[1].y() + m_el[2].z();
 
  258             temp[0]=((m_el[2].y() - m_el[1].z()) * s);
 
  259             temp[1]=((m_el[0].z() - m_el[2].x()) * s);
 
  260             temp[2]=((m_el[1].x() - m_el[0].y()) * s);
 
  264             int i = m_el[0].x() < m_el[1].y() ? 
 
  265                 (m_el[1].y() < m_el[2].z() ? 2 : 1) :
 
  266                 (m_el[0].x() < m_el[2].z() ? 2 : 0); 
 
  274             temp[3] = (m_el[k][j] - m_el[j][k]) * s;
 
  275             temp[j] = (m_el[j][i] + m_el[i][j]) * s;
 
  276             temp[k] = (m_el[k][i] + m_el[i][k]) * s;
 
  278         q.setValue(temp[0],temp[1],temp[2],temp[3]);
 
  312                 euler_out.roll = delta;
 
  313                 euler_out2.roll = delta;
 
  319                 euler_out.roll = delta;
 
  320                 euler_out2.roll = delta;
 
  325             euler_out.pitch = - 
tf2Asin(m_el[2].x());
 
  326             euler_out2.pitch = 
TF2SIMD_PI - euler_out.pitch;
 
  329                 m_el[2].z()/
tf2Cos(euler_out.pitch));
 
  331                 m_el[2].z()/
tf2Cos(euler_out2.pitch));
 
  334                 m_el[0].x()/
tf2Cos(euler_out.pitch));
 
  336                 m_el[0].x()/
tf2Cos(euler_out2.pitch));
 
  339         if (solution_number == 1)
 
  342             pitch = euler_out.pitch;
 
  343             roll = euler_out.roll;
 
  347             yaw = euler_out2.yaw; 
 
  348             pitch = euler_out2.pitch;
 
  349             roll = euler_out2.roll;
 
  370         return Matrix3x3(m_el[0].x() * s.x(), m_el[0].y() * s.y(), m_el[0].z() * s.z(),
 
  371             m_el[1].x() * s.x(), m_el[1].y() * s.y(), m_el[1].z() * s.z(),
 
  372             m_el[2].x() * s.x(), m_el[2].y() * s.y(), m_el[2].z() * s.z());
 
  398         return m_el[0].x() * v.x() + m_el[1].x() * v.y() + m_el[2].x() * v.z();
 
  402         return m_el[0].y() * v.x() + m_el[1].y() * v.y() + m_el[2].y() * v.z();
 
  406         return m_el[0].z() * v.x() + m_el[1].z() * v.y() + m_el[2].z() * v.z();
 
  423         for (
int step = maxSteps; step > 0; step--)
 
  458             tf2Scalar theta = (m_el[q][q] - m_el[p][p]) / (2 * mpq);
 
  464                 t = (theta >= 0) ? 1 / (theta + 
tf2Sqrt(1 + theta2))
 
  465                     : 1 / (theta - 
tf2Sqrt(1 + theta2));
 
  472                 t = 1 / (theta * (2 + 
tf2Scalar(0.5) / theta2));
 
  478             m_el[p][q] = m_el[q][p] = 0;
 
  479             m_el[p][p] -= t * mpq;
 
  480             m_el[q][q] += t * mpq;
 
  483             m_el[r][p] = m_el[p][r] = cos * mrp - sin * mrq;
 
  484             m_el[r][q] = m_el[q][r] = cos * mrq + sin * mrp;
 
  487             for (
int i = 0; i < 3; i++)
 
  489                 Vector3& row = rot[i];
 
  492                 row[p] = cos * mrp - sin * mrq;
 
  493                 row[q] = cos * mrq + sin * mrp;
 
  511         return m_el[r1][c1] * m_el[r2][c2] - m_el[r1][c2] * m_el[r2][c1];
 
  544     return tf2Triple((*
this)[0], (*
this)[1], (*
this)[2]);
 
  560     return Matrix3x3(m_el[0].x(), m_el[1].x(), m_el[2].x(),
 
  561         m_el[0].y(), m_el[1].y(), m_el[2].y(),
 
  562         m_el[0].z(), m_el[1].z(), m_el[2].z());
 
  568     return Matrix3x3(
cofac(1, 1, 2, 2), 
cofac(0, 2, 2, 1), 
cofac(0, 1, 1, 2),
 
  569         cofac(1, 2, 2, 0), 
cofac(0, 0, 2, 2), 
cofac(0, 2, 1, 0),
 
  570         cofac(1, 0, 2, 1), 
cofac(0, 1, 2, 0), 
cofac(0, 0, 1, 1));
 
  576     Vector3 co(
cofac(1, 1, 2, 2), 
cofac(1, 2, 2, 0), 
cofac(1, 0, 2, 1));
 
  581         co.y() * s, 
cofac(0, 0, 2, 2) * s, 
cofac(0, 2, 1, 0) * s,
 
  582         co.z() * s, 
cofac(0, 1, 2, 0) * s, 
cofac(0, 0, 1, 1) * s);
 
  589         m_el[0].x() * m[0].x() + m_el[1].x() * m[1].x() + m_el[2].x() * m[2].x(),
 
  590         m_el[0].x() * m[0].y() + m_el[1].x() * m[1].y() + m_el[2].x() * m[2].y(),
 
  591         m_el[0].x() * m[0].z() + m_el[1].x() * m[1].z() + m_el[2].x() * m[2].z(),
 
  592         m_el[0].y() * m[0].x() + m_el[1].y() * m[1].x() + m_el[2].y() * m[2].x(),
 
  593         m_el[0].y() * m[0].y() + m_el[1].y() * m[1].y() + m_el[2].y() * m[2].y(),
 
  594         m_el[0].y() * m[0].z() + m_el[1].y() * m[1].z() + m_el[2].y() * m[2].z(),
 
  595         m_el[0].z() * m[0].x() + m_el[1].z() * m[1].x() + m_el[2].z() * m[2].x(),
 
  596         m_el[0].z() * m[0].y() + m_el[1].z() * m[1].y() + m_el[2].z() * m[2].y(),
 
  597         m_el[0].z() * m[0].z() + m_el[1].z() * m[1].z() + m_el[2].z() * m[2].z());
 
  604         m_el[0].
dot(m[0]), m_el[0].
dot(m[1]), m_el[0].
dot(m[2]),
 
  605         m_el[1].
dot(m[0]), m_el[1].
dot(m[1]), m_el[1].
dot(m[2]),
 
  606         m_el[2].
dot(m[0]), m_el[2].
dot(m[1]), m_el[2].
dot(m[2]));
 
  613     return Vector3(m[0].
dot(v), m[1].
dot(v), m[2].
dot(v));
 
  651     return ( m1[0][0] == m2[0][0] && m1[1][0] == m2[1][0] && m1[2][0] == m2[2][0] &&
 
  652         m1[0][1] == m2[0][1] && m1[1][1] == m2[1][1] && m1[2][1] == m2[2][1] &&
 
  653         m1[0][2] == m2[0][2] && m1[1][2] == m2[1][2] && m1[2][2] == m2[2][2] );
 
  673     for (
int i=0;i<3;i++)
 
  679     for (
int i=0;i<3;i++)
 
  686     for (
int i=0;i<3;i++)
 
  692     for (
int i=0;i<3;i++)
 
  698     for (
int i=0;i<3;i++)
 
  703 #endif //TF2_MATRIX3x3_H 
  
void getEulerYPR(tf2Scalar &yaw, tf2Scalar &pitch, tf2Scalar &roll, unsigned int solution_number=1) const
Get the matrix represented as euler angles around YXZ, roundtrip with setEulerYPR.
Definition: Matrix3x3.h:286
TF2SIMD_FORCE_INLINE tf2Scalar dot(const Quaternion &q1, const Quaternion &q2)
Calculate the dot product between two quaternions.
Definition: Quaternion.h:395
void diagonalize(Matrix3x3 &rot, tf2Scalar threshold, int maxSteps)
diagonalizes this matrix by the Jacobi method.
Definition: Matrix3x3.h:420
void setRPY(tf2Scalar roll, tf2Scalar pitch, tf2Scalar yaw)
Set the matrix using RPY about XYZ fixed axes.
Definition: Matrix3x3.h:203
TF2SIMD_FORCE_INLINE tf2Scalar tf2Asin(tf2Scalar x)
Definition: Scalar.h:183
Matrix3x3 & operator*=(const Matrix3x3 &m)
Multiply by the target matrix on the right.
Definition: Matrix3x3.h:533
TF2SIMD_FORCE_INLINE tf2Scalar tf2Atan2(tf2Scalar x, tf2Scalar y)
Definition: Scalar.h:185
TF2SIMD_FORCE_INLINE Vector3 getColumn(int i) const
Get a column of the matrix as a vector.
Definition: Matrix3x3.h:86
Matrix3x3()
No initializaion constructor.
Definition: Matrix3x3.h:41
void deSerializeFloat(const struct Matrix3x3FloatData &dataIn)
Definition: Matrix3x3.h:690
Matrix3x3 inverse() const
Return the inverse of the matrix.
Definition: Matrix3x3.h:574
void getRotation(Quaternion &q) const
Get the matrix represented as a quaternion.
Definition: Matrix3x3.h:247
TF2SIMD_FORCE_INLINE tf2Scalar tdotz(const Vector3 &v) const
Definition: Matrix3x3.h:404
#define TF2SIMD_EPSILON
Definition: Scalar.h:202
TF2SIMD_FORCE_INLINE tf2Scalar tf2Sin(tf2Scalar x)
Definition: Scalar.h:180
TF2SIMD_FORCE_INLINE Matrix3x3 & operator=(const Matrix3x3 &other)
Assignment Operator.
Definition: Matrix3x3.h:75
Definition: Vector3.h:686
TF2SIMD_FORCE_INLINE tf2Scalar tf2Sqrt(tf2Scalar x)
Definition: Scalar.h:177
static const Matrix3x3 & getIdentity()
Definition: Matrix3x3.h:217
void getOpenGLSubMatrix(tf2Scalar *m) const
Fill the values of the matrix into a 9 element array.
Definition: Matrix3x3.h:228
void setRotation(const Quaternion &q)
Set the matrix from a quaternion.
Definition: Matrix3x3.h:155
Matrix3x3 transposeTimes(const Matrix3x3 &m) const
Definition: Matrix3x3.h:586
TF2SIMD_FORCE_INLINE tf2Scalar tdotx(const Vector3 &v) const
Definition: Matrix3x3.h:396
Definition: Vector3.h:681
void setValue(const tf2Scalar &xx, const tf2Scalar &xy, const tf2Scalar &xz, const tf2Scalar &yx, const tf2Scalar &yy, const tf2Scalar &yz, const tf2Scalar &zx, const tf2Scalar &zy, const tf2Scalar &zz)
Set the values of the matrix explicitly (row major)
Definition: Matrix3x3.h:143
TF2SIMD_FORCE_INLINE Matrix3x3(const Matrix3x3 &other)
Copy constructor.
Definition: Matrix3x3.h:66
void getRPY(tf2Scalar &roll, tf2Scalar &pitch, tf2Scalar &yaw, unsigned int solution_number=1) const
Get the matrix represented as roll pitch and yaw about fixed axes XYZ.
Definition: Matrix3x3.h:359
#define tf2FullAssert(x)
Definition: Scalar.h:148
for serialization
Definition: Matrix3x3.h:657
void deSerialize(const struct Matrix3x3Data &dataIn)
Definition: Matrix3x3.h:684
TF2SIMD_FORCE_INLINE bool operator==(const Matrix3x3 &m1, const Matrix3x3 &m2)
Equality operator between two matrices It will test all elements are equal.
Definition: Matrix3x3.h:649
void deSerializeDouble(const struct Matrix3x3DoubleData &dataIn)
Definition: Matrix3x3.h:696
void setEulerYPR(tf2Scalar eulerZ, tf2Scalar eulerY, tf2Scalar eulerX)
Set the matrix from euler angles YPR around ZYX axes.
Definition: Matrix3x3.h:179
TF2SIMD_FORCE_INLINE Vector3 operator*(const Matrix3x3 &m, const Vector3 &v)
Definition: Matrix3x3.h:611
Matrix3x3(const Quaternion &q)
Constructor from Quaternion.
Definition: Matrix3x3.h:47
Matrix3x3 absolute() const
Return the matrix with all values non negative.
Definition: Matrix3x3.h:549
#define TF2SIMD_FORCE_INLINE
Definition: Scalar.h:129
for serialization
Definition: Matrix3x3.h:663
const TF2SIMD_FORCE_INLINE Vector3 & getRow(int i) const
Get a row of the matrix as a vector.
Definition: Matrix3x3.h:94
TF2SIMD_FORCE_INLINE tf2Scalar tf2Cos(tf2Scalar x)
Definition: Scalar.h:179
void setIdentity()
Set the matrix to the identity.
Definition: Matrix3x3.h:209
Matrix3x3 scaled(const Vector3 &s) const
Create a scaled copy of the matrix.
Definition: Matrix3x3.h:368
tf2Scalar determinant() const
Return the determinant of the matrix.
Definition: Matrix3x3.h:542
#define Matrix3x3Data
Definition: Matrix3x3.h:28
const TF2SIMD_FORCE_INLINE Vector3 & operator[](int i) const
Get a const reference to a row of the matrix as a vector.
Definition: Matrix3x3.h:110
Vector3DoubleData m_el[3]
Definition: Matrix3x3.h:665
TF2SIMD_FORCE_INLINE tf2Scalar tf2Triple(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3)
Definition: Vector3.h:449
Definition: buffer_core.h:55
TF2SIMD_FORCE_INLINE tf2Scalar tf2Fabs(tf2Scalar x)
Definition: Scalar.h:178
void setFromOpenGLSubMatrix(const tf2Scalar *m)
Set from a carray of tf2Scalars.
Definition: Matrix3x3.h:125
Matrix3x3(const tf2Scalar &xx, const tf2Scalar &xy, const tf2Scalar &xz, const tf2Scalar &yx, const tf2Scalar &yy, const tf2Scalar &yz, const tf2Scalar &zx, const tf2Scalar &zy, const tf2Scalar &zz)
Constructor with row major formatting.
Definition: Matrix3x3.h:57
void serializeFloat(struct Matrix3x3FloatData &dataOut) const
Definition: Matrix3x3.h:677
#define TF2_PUBLIC
Definition: visibility_control.h:58
The Quaternion implements quaternion to perform linear algebra rotations in combination with Matrix3x...
Definition: Quaternion.h:29
Matrix3x3 timesTranspose(const Matrix3x3 &m) const
Definition: Matrix3x3.h:601
void serialize(struct Matrix3x3Data &dataOut) const
Definition: Matrix3x3.h:671
Matrix3x3 transpose() const
Return the transpose of the matrix.
Definition: Matrix3x3.h:558
double tf2Scalar
The tf2Scalar type abstracts floating point numbers, to easily switch between double and single float...
Definition: Scalar.h:159
#define TF2SIMD_PI
Definition: Scalar.h:193
The Matrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with Q...
Definition: Matrix3x3.h:33
Vector3FloatData m_el[3]
Definition: Matrix3x3.h:659
TF2SIMD_FORCE_INLINE Vector3 & operator[](int i)
Get a mutable reference to a row of the matrix as a vector.
Definition: Matrix3x3.h:102
Matrix3x3 adjoint() const
Return the adjoint of the matrix.
Definition: Matrix3x3.h:566
TF2SIMD_FORCE_INLINE tf2Scalar tdoty(const Vector3 &v) const
Definition: Matrix3x3.h:400
tf2Scalar cofac(int r1, int c1, int r2, int c2) const
Calculate the matrix cofactor.
Definition: Matrix3x3.h:509
tf2Scalar length2() const
Return the length squared of the quaternion.
Definition: Quaternion.h:152