64 Tmat3(
const double in00,
const double in01,
const double in02,
65 const double in10,
const double in11,
const double in12,
66 const double in20,
const double in21,
const double in22);
157 this->
v[0][0] = this->
v[1][1] = this->
v[2][2] = diagValue;
158 this->
v[1][0] = this->
v[2][0] = this->
v[2][1] = 0;
159 this->
v[0][1] = this->
v[0][2] = this->
v[1][2] = 0;
175 this->
v[0] = mat.
v[0];
176 this->
v[1] = mat.
v[1];
177 this->
v[2] = mat.
v[2];
227 this->
v[0] += m.
v[0];
228 this->
v[1] += m.
v[1];
229 this->
v[2] += m.
v[2];
238 this->
v[0] -= m.
v[0];
239 this->
v[1] -= m.
v[1];
240 this->
v[2] -= m.
v[2];
276 return Tmat3<DT>(a) *=
static_cast<DT
>(-1.0);
332 const double in10,
const double in11,
const double in12,
333 const double in20,
const double in21,
const double in22)
335 this->
v[0][0]=
static_cast<DT
>(in00); this->
v[0][1]=
static_cast<DT
>(in01); this->
v[0][2]=
static_cast<DT
>(in02);
336 this->
v[1][0]=
static_cast<DT
>(in10); this->
v[1][1]=
static_cast<DT
>(in11); this->
v[1][2]=
static_cast<DT
>(in12);
337 this->
v[2][0]=
static_cast<DT
>(in20); this->
v[2][1]=
static_cast<DT
>(in21); this->
v[2][2]=
static_cast<DT
>(in22);
347 this->
v[0][0] =
static_cast<DT
>(mat[0]); this->
v[0][1] =
static_cast<DT
>(mat[1]); this->
v[0][2] =
static_cast<DT
>(mat[2]);
348 this->
v[1][0] =
static_cast<DT
>(mat[3]); this->
v[1][1] =
static_cast<DT
>(mat[4]); this->
v[1][2] =
static_cast<DT
>(mat[5]);
349 this->
v[2][0] =
static_cast<DT
>(mat[6]); this->
v[2][1] =
static_cast<DT
>(mat[7]); this->
v[2][2] =
static_cast<DT
>(mat[8]);
360 mat[0] =
static_cast<float>(this->
v[0][0]); mat[1] =
static_cast<float>(this->
v[0][1]); mat[2] =
static_cast<float>(this->
v[0][2]);
361 mat[3] =
static_cast<float>(this->
v[1][0]); mat[4] =
static_cast<float>(this->
v[1][1]); mat[5] =
static_cast<float>(this->
v[1][2]);
362 mat[6] =
static_cast<float>(this->
v[2][0]); mat[7] =
static_cast<float>(this->
v[2][1]); mat[8] =
static_cast<float>(this->
v[2][2]);
371 this->
v[0][0] =
static_cast<DT
>(mat[0]); this->
v[0][1] =
static_cast<DT
>(mat[1]); this->
v[0][2] =
static_cast<DT
>(mat[2]);
372 this->
v[1][0] =
static_cast<DT
>(mat[3]); this->
v[1][1] =
static_cast<DT
>(mat[4]); this->
v[1][2] =
static_cast<DT
>(mat[5]);
373 this->
v[2][0] =
static_cast<DT
>(mat[6]); this->
v[2][1] =
static_cast<DT
>(mat[7]); this->
v[2][2] =
static_cast<DT
>(mat[8]);
384 mat[0] =
static_cast<double>(this->
v[0][0]); mat[1] =
static_cast<double>(this->
v[0][1]); mat[2] =
static_cast<double>(this->
v[0][2]);
385 mat[3] =
static_cast<double>(this->
v[1][0]); mat[4] =
static_cast<double>(this->
v[1][1]); mat[5] =
static_cast<double>(this->
v[1][2]);
386 mat[6] =
static_cast<double>(this->
v[2][0]); mat[7] =
static_cast<double>(this->
v[2][1]); mat[8] =
static_cast<double>(this->
v[2][2]);
396 this->
v[0][0]=scale; this->
v[0][1]=0; this->
v[0][2]=0;
397 this->
v[1][0]=0; this->
v[1][1]=scale; this->
v[1][2]=0;
398 this->
v[2][0]=0; this->
v[2][1]=0; this->
v[2][2]=scale;
409#define DET3(A,B,C,D,E,F,G,H,I) ((A*E*I + B*F*G + C*D*H) - (A*F*H + B*D*I + C*E*G))
416 return DET3(this->
v[0][0], this->
v[0][1], this->
v[0][2],
417 this->
v[1][0], this->
v[1][1], this->
v[1][2],
418 this->
v[2][0], this->
v[2][1], this->
v[2][2]);
430 Tvec3<DT>(this->
v[0][2], this->
v[1][2], this->
v[2][2]));
450 this->
v[0].apply(fct);
451 this->
v[1].apply(fct);
452 this->
v[2].apply(fct);
457#define _ML_MAT3_RC(i, j) a[i][0]*b[0][j] + a[i][1]*b[1][j] + a[i][2]*b[2][j]
477 return (a[0] == b[0]) &&
526 DT angleRad = angleDeg * M_PI / 180.0;
527 DT c = cos(angleRad);
528 DT s = sin(angleRad);
531 Tvec3<DT>(s, c, Center[1] * (1.0-c) - Center[0] * s),
570 DT c = 0, s = 0, t = 0;
575 int p = 0, q = 0, i = 0, j = 0;
578 Tvec3<DT> b (this->
v[0][0], this->
v[1][1], this->
v[2][2]);
585 for (i = 0; i < 50; i++){
587 for (p = 0; p < 2; p++){
588 for (q = p+1; q < 3; q++){
589 sm += std::abs(a.
v[p][q]);
597 thresh = (i < 3 ? (.2 * sm / 9) : 0.0);
599 for (p = 0; p < 2; p++) {
600 for (q = p+1; q < 3; q++) {
602 g = 100.0 * std::abs(a.
v[p][q]);
605 (std::abs(evalues[p]) + g == std::abs(evalues[p])) &&
606 (std::abs(evalues[q]) + g == std::abs(evalues[q]))){
609 else if (std::abs(a.
v[p][q]) > thresh) {
610 h = evalues[q] - evalues[p];
611 if (std::abs(h) + g == std::abs(h)){
615 theta = .5 * h / a.
v[p][q];
616 t = 1.0 / (std::abs(theta) +
sqrt(1 + theta * theta));
623 c = 1.0 /
sqrt(1.0 + t*t);
633 for (j = 0; j < p; j++) {
636 a.
v[j][p] = g - s * (h + g * tau);
637 a.
v[j][q] = h + s * (g - h * tau);
640 for (j = p+1; j < q; j++) {
643 a.
v[p][j] = g - s * (h + g * tau);
644 a.
v[j][q] = h + s * (g - h * tau);
647 for (j = q+1; j < 3; j++) {
650 a.
v[p][j] = g - s * (h + g * tau);
651 a.
v[q][j] = h + s * (g - h * tau);
654 for (j = 0; j < 3; j++) {
655 g = evectors.
v[j][p];
656 h = evectors.
v[j][q];
657 evectors.
v[j][p] = g - s * (h + g * tau);
658 evectors.
v[j][q] = h + s * (g - h * tau);
667 for (p = 0; p < 3; p++) {
668 evalues[p] = b[p] += z[p];
688 static const DT Epsilon =
static_cast<DT
>(0.);
694 "Tmat3<DT> Tmat3<DT>::inverse(bool* isInvertible) const, matrix not invertable",
722 inline std::ostream &
operator<<(std::ostream &os,
const ML_LA_NAMESPACE::Tmat3<DT> &m)
724 return os << m[0] <<
'\n' << m[1] <<
'\n' << m[2];
731 inline std::istream &
operator>>(std::istream &is, ML_LA_NAMESPACE::Tmat3<DT> &m)
733 ML_LA_NAMESPACE::Tmat3<DT> m_tmp;
735 is >> m_tmp[0] >> m_tmp[1] >> m_tmp[2];
736 if (is){ m = m_tmp; }
A 3x3 matrix class of three row vectors.
bool operator<(const Tmat3< DT > &) const
void setValues(const float mat[9])
Copies the contents from float array mat into *this, row by row.
static Tmat3 getIdentity()
Returns the identity matrix.
static Tmat3< DT > getMat(const double val)
Returns a matrix filled with values val.
void setScaleMatrix(const DT scale)
Sets the diagonal matrix with scale on the diagonal.
Tmat3(const double in00, const double in01, const double in02, const double in10, const double in11, const double in12, const double in20, const double in21, const double in22)
const Tmat3< DT > & operator+=(const Tmat3< DT > &m)
Increments by a Tmat3.
Tmat3(const double mat[9])
Constructor from nine double values in an array given by mat, row by row.
const Tmat3< DT > & operator-=(const Tmat3< DT > &m)
Decrements by a Tmat3.
void getValues(float mat[9]) const
const Tmat3< DT > & operator*=(const DT d)
Multiplies by a scalar constant d.
void getValues(double mat[9]) const
Copies the contents of *this into double array mat, row by row.
Tmat3 transpose() const
Returns the transpose of this matrix.
Tmat3(const Tmat3< DT > &mat)
Copy constructor from the Tmat3 mat.
Tmat3(const Tvec3< DT > &row0, const Tvec3< DT > &row1, const Tvec3< DT > &row2)
Builds a matrix of the three row vectors row0, row1, row2.
Tmat3(const DT diagValue)
Builds a matrix that has the argument diagValue as the diagonal values, zero otherwise.
DT ComponentType
A typedef to 'export' the type of components.
const Tmat3< DT > & apply(MLDblFuncPtr fct)
Applies the function fct to each component.
Tmat3(const float mat[9])
Constructor from nine floating point values in an array given by mat, row by row.
void setValues(const double mat[9])
Copies the contents from double array mat into *this, row by row.
Tmat3 jacobi(Tvec3< DT > &eVal, int &rots) const
Calculates the Jacobi-decomposition of 3x3 matrix.
Tmat3()
Builds a 3x3 matrix from nine zero elements.
Tmat3 inverse(bool *isInvertible=nullptr) const
const Tmat3< DT > & operator=(const Tmat3< DT > &m)
Assigns from a Tmat3.
const Tmat3< DT > & operator/=(const DT d)
Divides by a constant d. Division by zero is not handled and must be avoided by caller.
void set(DT val)
Sets all values to val.
DT det() const
Returns the determinant of this matrix.
Declaration of float vector type traits.
Forward declarations to resolve header file dependencies.
#define DET3(A, B, C, D, E, F, G, H, I)
Internal helper macro to calculate the determinant of 3x3 matrix with given entries,...
#define _ML_MAT3_RC(i, j)
Internal helper macro to multiply two matrices, do not use.
double(* MLDblFuncPtr)(double)
A function pointer type to a function that returns a double and takes a double as argument.
Tmat3< MLfloat > Matrix3f
A 3x3 matrix of type float.
FloatingPointVector< T, size, DataContainer > operator/(FloatingPointVector< T, size, DataContainer > lhs, MLdouble rhs)
bool operator==(const Tmat2< DT > &a, const Tmat2< DT > &b)
a == b ? Returns true if yes.
Tmat3< DT > translation2D(const Tvec2< DT > &v)
T operator*(const FloatingPointVector< T, size, DataContainer > &a, const FloatingPointVector< T, size, DataContainer > &b)
Tmat3< DT > rotation2D(const Tvec2< DT > &Center, const DT angleDeg)
Tmat3< MLdouble > Matrix3
The standard 3x3 matrix of type double.
bool operator!=(const Tmat2< DT > &a, const Tmat2< DT > &b)
a != b ? Returns true if yes.
FloatingPointVector< T, size, DataContainer > operator+(FloatingPointVector< T, size, DataContainer > lhs, const FloatingPointVector< T, size, DataContainer > &rhs)
Tmat3< MLldouble > Matrix3ld
A 3x3 matrix of type long double.
Tmat3< DT > scaling2D(const Tvec2< DT > &scaleVector)
Returns a 2D scale matrix as 3D homogeneous matrix.
Tmat3< MLdouble > Matrix3d
A 3x3 matrix of type double.
FloatingPointVector< T, size, DataContainer > operator-(FloatingPointVector< T, size, DataContainer > lhs, const FloatingPointVector< T, size, DataContainer > &rhs)
BASE_TYPE MLInverseMatHelper(const BASE_TYPE &origMat, bool *isInvertible, const typename BASE_TYPE::ComponentType, const char *const ZeroDetErrString, const BASE_TYPE &Identity, const size_t Dim)
MLEXPORT std::ostream & operator<<(std::ostream &s, const ml::Field &v)
Overloads the operator '<<' for stream output of Field objects.
istream & operator>>(istream &is, ml::FloatingPointVector< T, size, DataContainer > &v)
Reads a vector from std::istream.