feat: Fix misleading doc.

This commit is contained in:
Thorben Höhne 2025-05-04 16:30:02 +02:00
parent 77d39b6254
commit 81ef16cc99
Signed by: thoehne
GPG Key ID: 60D202D915B81DEC

View File

@ -7,63 +7,64 @@
#include "Core/Math/Vector2.hpp" #include "Core/Math/Vector2.hpp"
#ifndef MATRIX2_H #ifndef MATRIX2_H
#define MATRIX2_H # define MATRIX2_H
namespace Phanes::Core::Math { namespace Phanes::Core::Math
{
// 2x2 Matrix defined in column-major order.
// Accessed by M[Row][Col].
template<RealType T> // 2x2 Matrix defined in column-major order.
struct TMatrix2 // Accessed by M[Col][Row].
{
public:
union template <RealType T>
{ struct TMatrix2
struct {
{ public:
/// <summary> union
/// Column one. {
/// </summary> struct
TVector2<T, false> c0; {
/// <summary>
/// Column one.
/// </summary>
TVector2<T, false> c0;
/// <summary> /// <summary>
/// Column two /// Column two
/// </summary> /// </summary>
TVector2<T, false> c1; TVector2<T, false> c1;
}; };
T data[2][2]; T data[2][2];
}; };
public: public:
TMatrix2() = default;
TMatrix2() = default; /**
/**
* Copy constructor. * Copy constructor.
*/ */
TMatrix2(const TMatrix2<T>& m1) TMatrix2(const TMatrix2<T>& m1)
{ {
this->c0 = m1.c0; this->c0 = m1.c0;
this->c1 = m1.c1; this->c1 = m1.c1;
} }
/** /**
* Construct Matrix from 2d array. * Construct Matrix from 2d array.
* *
* @param(fields) 2D Array with column major order. * @param(fields) 2D Array with column major order.
*/ */
TMatrix2(T fields[2][2]) TMatrix2(T fields[2][2])
{ {
this->data[0][0] = fields[0][0]; this->data[1][0] = fields[1][0]; this->data[0][0] = fields[0][0];
this->data[0][1] = fields[0][1]; this->data[1][1] = fields[1][1]; this->data[1][0] = fields[1][0];
} this->data[0][1] = fields[0][1];
this->data[1][1] = fields[1][1];
}
/** /**
* Construct Matrix from parameters. * Construct Matrix from parameters.
* *
* @param(n00) M[0][0] * @param(n00) M[0][0]
@ -74,285 +75,277 @@ namespace Phanes::Core::Math {
* @note nXY = n[Row][Col] * @note nXY = n[Row][Col]
*/ */
TMatrix2(T n00, T n01, T n10, T n11) TMatrix2(T n00, T n01, T n10, T n11)
{ {
this->data[0][0] = n00; this->data[1][0] = n01; this->data[0][0] = n00;
this->data[0][1] = n10; this->data[1][1] = n11; this->data[1][0] = n01;
} this->data[0][1] = n10;
this->data[1][1] = n11;
}
/** /**
* Construct Matrix from two 2d vector columns. * Construct Matrix from two 2d vector columns.
* *
* @param(v1) Column zero * @param(v1) Column zero
* @param(v2) Column one * @param(v2) Column one
*/ */
TMatrix2(const TVector2<T, false>& v1, const TVector2<T, false>& v2) TMatrix2(const TVector2<T, false>& v1, const TVector2<T, false>& v2)
{ {
this->c0 = v1; this->c0 = v1;
this->c1 = v2; this->c1 = v2;
} }
public: public:
T& operator()(int n, int m)
{
return this->data[m][n];
}
T& operator() (int n, int m) T operator()(int n, int m) const
{ {
return this->data[m][n]; return this->data[m][n];
} }
T operator() (int n, int m) const TVector2<T, false>& operator[](int m)
{ {
return this->data[m][n]; switch(m)
} {
case 0:
return this->c0;
case 1:
return this->c1;
}
TVector2<T, false>& operator[] (int m) throw std::invalid_argument("m is outside valid range.");
{ }
switch (m)
{
case 0:
return this->c0;
case 1:
return this->c1;
}
throw std::invalid_argument("m is outside valid range."); TVector2<T, false> operator[](int m) const
} {
switch(m)
{
case 0:
return this->c0;
case 1:
return this->c1;
}
TVector2<T, false> operator[] (int m) const throw std::invalid_argument("m is outside valid range.");
{ }
switch (m) };
{
case 0:
return this->c0;
case 1:
return this->c1;
}
throw std::invalid_argument("m is outside valid range."); // ====================== //
} // TMatrix2 operator //
// ====================== //
}; template <RealType T>
TMatrix2<T>& operator+=(TMatrix2<T>& m1, T s)
{
m1(0, 0) += s;
m1(0, 1) += s;
m1(1, 0) += s;
m1(1, 1) += s;
// ====================== // return m1;
// TMatrix2 operator // }
// ====================== //
template<RealType T>
TMatrix2<T>& operator+= (TMatrix2<T>& m1, T s)
{
m1(0, 0) += s;
m1(0, 1) += s;
m1(1, 0) += s;
m1(1, 1) += s;
return m1; template <RealType T>
} TMatrix2<T>& operator+=(TMatrix2<T>& m1, const TMatrix2<T>& m2)
{
m1(0, 0) += m2(0, 0);
m1(0, 1) += m2(0, 1);
m1(1, 0) += m2(1, 0);
m1(1, 1) += m2(1, 1);
template<RealType T> return m1;
TMatrix2<T>& operator+= (TMatrix2<T>& m1, const TMatrix2<T>& m2) }
{
m1(0, 0) += m2(0, 0);
m1(0, 1) += m2(0, 1);
m1(1, 0) += m2(1, 0);
m1(1, 1) += m2(1, 1);
return m1; template <RealType T>
} TMatrix2<T>& operator-=(TMatrix2<T>& m1, T s)
{
template<RealType T> m1(0, 0) -= s;
TMatrix2<T>& operator-= (TMatrix2<T>& m1, T s) m1(0, 1) -= s;
{ m1(1, 0) -= s;
m1(0, 0) -= s; m1(1, 1) -= s;
m1(0, 1) -= s;
m1(1, 0) -= s;
m1(1, 1) -= s;
return m1; return m1;
} }
template<RealType T>
TMatrix2<T>& operator-= (TMatrix2<T>& m1, const TMatrix2<T>& m2)
{
m1(0, 0) -= m2(0, 0);
m1(0, 1) -= m2(0, 1);
m1(1, 0) -= m2(1, 0);
m1(1, 1) -= m2(1, 1);
return m1; template <RealType T>
} TMatrix2<T>& operator-=(TMatrix2<T>& m1, const TMatrix2<T>& m2)
{
template<RealType T> m1(0, 0) -= m2(0, 0);
TMatrix2<T>& operator*= (TMatrix2<T>& m1, T s) m1(0, 1) -= m2(0, 1);
{ m1(1, 0) -= m2(1, 0);
m1.data[0][0] *= s; m1(1, 1) -= m2(1, 1);
m1.data[0][1] *= s;
m1.data[1][0] *= s;
m1.data[1][1] *= s;
return m1; return m1;
} }
template<RealType T>
TMatrix2<T>& operator*= (TMatrix2<T>& m1, const TMatrix2<T>& m2)
{
TMatrix2<T> c = m1;
m1(0, 0) = c(0, 0) * m2(0, 0) + c(0, 1) * m2(1, 0); template <RealType T>
m1(0, 1) = c(0, 0) * m2(0, 1) + c(0, 1) * m2(1, 1); TMatrix2<T>& operator*=(TMatrix2<T>& m1, T s)
{
m1.data[0][0] *= s;
m1.data[0][1] *= s;
m1.data[1][0] *= s;
m1.data[1][1] *= s;
m1(1, 0) = c(1, 0) * m2(0, 0) + c(1, 1) * m2(1, 0); return m1;
m1(1, 1) = c(1, 0) * m2(0, 1) + c(1, 1) * m2(1, 1); }
return m1; template <RealType T>
} TMatrix2<T>& operator*=(TMatrix2<T>& m1, const TMatrix2<T>& m2)
{
TMatrix2<T> c = m1;
template<RealType T> m1(0, 0) = c(0, 0) * m2(0, 0) + c(0, 1) * m2(1, 0);
TMatrix2<T>& operator/= (TMatrix2<T>& m1, T s) m1(0, 1) = c(0, 0) * m2(0, 1) + c(0, 1) * m2(1, 1);
{
s = (T)1.0 / s;
m1.data[0][0] *= s;
m1.data[0][1] *= s;
m1.data[1][0] *= s;
m1.data[1][1] *= s;
return m1; m1(1, 0) = c(1, 0) * m2(0, 0) + c(1, 1) * m2(1, 0);
} m1(1, 1) = c(1, 0) * m2(0, 1) + c(1, 1) * m2(1, 1);
template<RealType T> return m1;
TMatrix2<T> operator+ (const TMatrix2<T>& m1, T s) }
{
return TMatrix2<T>(m1(0, 0) + s, m1(0, 1) + s,
m1(1, 0) + s, m1(1, 1) + s);
}
template<RealType T>
TMatrix2<T> operator+ (const TMatrix2<T>& m1, const TMatrix2<T>& m2)
{
return TMatrix2<T>(m1(0, 0) + m2(0, 0), m1(0, 1) + m2(0, 1),
m1(1, 0) + m2(1, 0), m1(1, 1) + m2(1, 1));
}
template<RealType T> template <RealType T>
TMatrix2<T> operator- (const TMatrix2<T>& m1, T s) TMatrix2<T>& operator/=(TMatrix2<T>& m1, T s)
{ {
return TMatrix2<T>(m1(0, 0) - s, m1(0, 1) - s, s = (T)1.0 / s;
m1(1, 0) - s, m1(1, 1) - s); m1.data[0][0] *= s;
} m1.data[0][1] *= s;
m1.data[1][0] *= s;
template<RealType T> m1.data[1][1] *= s;
TMatrix2<T> operator- (const TMatrix2<T>& m1, const TMatrix2<T>& m2)
{
return TMatrix2<T>(m1(0, 0) - m2(0, 0), m1(0, 1) - m2(0, 1),
m1(1, 0) - m2(1, 0), m1(1, 1) - m2(1, 1));
}
template<RealType T> return m1;
TMatrix2<T> operator* (const TMatrix2<T>& m1, T s) }
{
return TMatrix2<T>(m1(0, 0) * s, m1(0, 1) * s,
m1(1, 0) * s, m1(1, 1) * s);
}
template<RealType T> template <RealType T>
TMatrix2<T> operator/ (const TMatrix2<T>& m1, T s) TMatrix2<T> operator+(const TMatrix2<T>& m1, T s)
{ {
s = (T)1.0 / s; return TMatrix2<T>(m1(0, 0) + s, m1(0, 1) + s, m1(1, 0) + s, m1(1, 1) + s);
return TMatrix2<T>(m1(0, 0) * s, m1(0, 1) * s, }
m1(1, 0) * s, m1(1, 1) * s);
}
template<RealType T>
TMatrix2<T> operator* (const TMatrix2<T>& m1, const TMatrix2<T>& m2)
{
return TMatrix2<T>(m1(0, 0) * m2(0, 0) + m1(0, 1) * m2(1, 0), m1(0, 0) * m2(0, 1) + m1(0, 1) * m2(1, 1),
m1(1, 0) * m2(0, 0) + m1(1, 1) * m2(1, 0), m1(1, 0) * m2(0, 1) + m1(1, 1) * m2(1, 1));
}
template<RealType T>
TVector2<T, false> operator* (const TMatrix2<T>& m1, const TVector2<T, false>& v)
{
return TVector2<T, false>(m1(0, 0) * v.x + m1(0, 1) * v.y,
m1(1, 0) * v.x + m1(1, 1) * v.y);
}
template<RealType T> template <RealType T>
bool operator== (const TMatrix2<T>& m1, const TMatrix2<T>& m2) TMatrix2<T> operator+(const TMatrix2<T>& m1, const TMatrix2<T>& m2)
{ {
return m1[0] == m2[0] && m1[1] == m2[1]; return TMatrix2<T>(
} m1(0, 0) + m2(0, 0), m1(0, 1) + m2(0, 1), m1(1, 0) + m2(1, 0), m1(1, 1) + m2(1, 1));
}
template<RealType T> template <RealType T>
bool operator!= (const TMatrix2<T>& m1, const TMatrix2<T>& m2) TMatrix2<T> operator-(const TMatrix2<T>& m1, T s)
{ {
return m1[0] != m2[0] || m1[1] != m2[1]; return TMatrix2<T>(m1(0, 0) - s, m1(0, 1) - s, m1(1, 0) - s, m1(1, 1) - s);
} }
template <RealType T>
TMatrix2<T> operator-(const TMatrix2<T>& m1, const TMatrix2<T>& m2)
{
return TMatrix2<T>(
m1(0, 0) - m2(0, 0), m1(0, 1) - m2(0, 1), m1(1, 0) - m2(1, 0), m1(1, 1) - m2(1, 1));
}
// ============================== // template <RealType T>
// Matrix function definition // TMatrix2<T> operator*(const TMatrix2<T>& m1, T s)
// ============================== // {
return TMatrix2<T>(m1(0, 0) * s, m1(0, 1) * s, m1(1, 0) * s, m1(1, 1) * s);
}
template<RealType T> template <RealType T>
T Determinant(const TMatrix2<T>& m1) TMatrix2<T> operator/(const TMatrix2<T>& m1, T s)
{ {
return m1(0, 0) * m1(1, 1) - m1(0, 1) * m1(1, 0); s = (T)1.0 / s;
} return TMatrix2<T>(m1(0, 0) * s, m1(0, 1) * s, m1(1, 0) * s, m1(1, 1) * s);
}
template<RealType T> template <RealType T>
TMatrix2<T>& InverseV(TMatrix2<T>& m1) TMatrix2<T> operator*(const TMatrix2<T>& m1, const TMatrix2<T>& m2)
{ {
float _1_det = 1.0f / Determinant(m1); return TMatrix2<T>(m1(0, 0) * m2(0, 0) + m1(0, 1) * m2(1, 0),
float m00 = m1(0, 0); m1(0, 0) * m2(0, 1) + m1(0, 1) * m2(1, 1),
m1(1, 0) * m2(0, 0) + m1(1, 1) * m2(1, 0),
m1(1, 0) * m2(0, 1) + m1(1, 1) * m2(1, 1));
}
m1(0, 0) = m1(1, 1); template <RealType T>
m1(0, 1) = -m1(0, 1); TVector2<T, false> operator*(const TMatrix2<T>& m1, const TVector2<T, false>& v)
m1(1, 0) = -m1(1, 0); {
m1(1, 1) = m00; return TVector2<T, false>(m1(0, 0) * v.x + m1(0, 1) * v.y, m1(1, 0) * v.x + m1(1, 1) * v.y);
}
m1 *= _1_det; template <RealType T>
return m1; bool operator==(const TMatrix2<T>& m1, const TMatrix2<T>& m2)
} {
return m1[0] == m2[0] && m1[1] == m2[1];
}
template<RealType T> template <RealType T>
TMatrix2<T>& TransposeV(TMatrix2<T>& m1) bool operator!=(const TMatrix2<T>& m1, const TMatrix2<T>& m2)
{ {
Swap(m1(0, 1), m1(1, 0)); return m1[0] != m2[0] || m1[1] != m2[1];
}
return m1; // ============================== //
} // Matrix function definition //
// ============================== //
// =============== // template <RealType T>
// WITH RETURN // T Determinant(const TMatrix2<T>& m1)
// =============== // {
return m1(0, 0) * m1(1, 1) - m1(0, 1) * m1(1, 0);
}
template<RealType T> template <RealType T>
TMatrix2<T> Inverse(TMatrix2<T>& m1) TMatrix2<T>& InverseV(TMatrix2<T>& m1)
{ {
float _1_det = 1.0f / Determinant(m1); float _1_det = 1.0f / Determinant(m1);
float m00 = m1(0, 0);
return TMatrix2<T>( m1(1, 1) * _1_det, -m1(0, 1) * _1_det, m1(0, 0) = m1(1, 1);
-m1(1, 0) * _1_det, m1(0, 0) * _1_det); m1(0, 1) = -m1(0, 1);
} m1(1, 0) = -m1(1, 0);
m1(1, 1) = m00;
template<RealType T> m1 *= _1_det;
TMatrix2<T> Transpose(const TMatrix2<T>& m1) return m1;
{ }
return TMatrix2<T>(m1(0, 0), m1(1, 0),
m1(0, 1), m1(1, 1));
}
template<RealType T> template <RealType T>
bool IsIdentityMatrix(const TMatrix2<T>& m1, T threshold = P_FLT_INAC) TMatrix2<T>& TransposeV(TMatrix2<T>& m1)
{ {
return (abs(m1(0, 0) - (T)1.0) < P_FLT_INAC && abs(m1(0, 1)) < P_FLT_INAC && Swap(m1(0, 1), m1(1, 0));
abs(m1(1, 0)) < P_FLT_INAC && abs(m1(1, 1) - (T)1.0) < P_FLT_INAC);
}
} // Phanes::Core::Math return m1;
}
// =============== //
// WITH RETURN //
// =============== //
template <RealType T>
TMatrix2<T> Inverse(TMatrix2<T>& m1)
{
float _1_det = 1.0f / Determinant(m1);
return TMatrix2<T>(
m1(1, 1) * _1_det, -m1(0, 1) * _1_det, -m1(1, 0) * _1_det, m1(0, 0) * _1_det);
}
template <RealType T>
TMatrix2<T> Transpose(const TMatrix2<T>& m1)
{
return TMatrix2<T>(m1(0, 0), m1(1, 0), m1(0, 1), m1(1, 1));
}
template <RealType T>
bool IsIdentityMatrix(const TMatrix2<T>& m1, T threshold = P_FLT_INAC)
{
return (abs(m1(0, 0) - (T)1.0) < P_FLT_INAC && abs(m1(0, 1)) < P_FLT_INAC &&
abs(m1(1, 0)) < P_FLT_INAC && abs(m1(1, 1) - (T)1.0) < P_FLT_INAC);
}
} // namespace Phanes::Core::Math
#endif // !MATRIX2_H #endif // !MATRIX2_H
#include "Core/Math/SIMD/SIMDIntrinsics.h"
#include "Core/Math/SIMD/SIMDIntrinsics.h"