Bug fixes.
This commit is contained in:
parent
f137d6ba8a
commit
bd0ce0f76d
@ -96,12 +96,30 @@ namespace Phanes::Core::Math {
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
FORCEINLINE T operator() (int n, int m) const
|
T& operator() (int n, int m)
|
||||||
{
|
{
|
||||||
this->data[m][n];
|
return this->data[m][n];
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCEINLINE TVector2<T, false> operator[] (int m) const
|
T operator() (int n, int m) const
|
||||||
|
{
|
||||||
|
return this->data[m][n];
|
||||||
|
}
|
||||||
|
|
||||||
|
TVector2<T, false>& operator[] (int m)
|
||||||
|
{
|
||||||
|
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)
|
switch (m)
|
||||||
{
|
{
|
||||||
@ -123,10 +141,10 @@ namespace Phanes::Core::Math {
|
|||||||
template<RealType T>
|
template<RealType T>
|
||||||
TMatrix2<T> operator+= (TMatrix2<T>& m1, T s)
|
TMatrix2<T> operator+= (TMatrix2<T>& m1, T s)
|
||||||
{
|
{
|
||||||
m1->m(0, 0) += s;
|
m1(0, 0) += s;
|
||||||
m1->m(0, 1) += s;
|
m1(0, 1) += s;
|
||||||
m1->m(1, 0) += s;
|
m1(1, 0) += s;
|
||||||
m1->m(1, 1) += s;
|
m1(1, 1) += s;
|
||||||
|
|
||||||
return m1;
|
return m1;
|
||||||
}
|
}
|
||||||
@ -134,10 +152,10 @@ namespace Phanes::Core::Math {
|
|||||||
template<RealType T>
|
template<RealType T>
|
||||||
TMatrix2<T> operator+= (TMatrix2<T>& m1, const TMatrix2<T>& m2)
|
TMatrix2<T> operator+= (TMatrix2<T>& m1, const TMatrix2<T>& m2)
|
||||||
{
|
{
|
||||||
m1->m(0, 0) += m2.m(0, 0);
|
m1(0, 0) += m2(0, 0);
|
||||||
m1->m(0, 1) += m2.m(0, 1);
|
m1(0, 1) += m2(0, 1);
|
||||||
m1->m(1, 0) += m2.m(1, 0);
|
m1(1, 0) += m2(1, 0);
|
||||||
m1->m(1, 1) += m2.m(1, 1);
|
m1(1, 1) += m2(1, 1);
|
||||||
|
|
||||||
return m1;
|
return m1;
|
||||||
}
|
}
|
||||||
@ -145,10 +163,10 @@ namespace Phanes::Core::Math {
|
|||||||
template<RealType T>
|
template<RealType T>
|
||||||
TMatrix2<T> operator-= (TMatrix2<T>& m1, T s)
|
TMatrix2<T> operator-= (TMatrix2<T>& m1, T s)
|
||||||
{
|
{
|
||||||
m1->m(0, 0) -= s;
|
m1(0, 0) -= s;
|
||||||
m1->m(0, 1) -= s;
|
m1(0, 1) -= s;
|
||||||
m1->m(1, 0) -= s;
|
m1(1, 0) -= s;
|
||||||
m1->m(1, 1) -= s;
|
m1(1, 1) -= s;
|
||||||
|
|
||||||
return m1;
|
return m1;
|
||||||
}
|
}
|
||||||
@ -156,10 +174,10 @@ namespace Phanes::Core::Math {
|
|||||||
template<RealType T>
|
template<RealType T>
|
||||||
TMatrix2<T> operator-= (TMatrix2<T>& m1, const TMatrix2<T>& m2)
|
TMatrix2<T> operator-= (TMatrix2<T>& m1, const TMatrix2<T>& m2)
|
||||||
{
|
{
|
||||||
m1->m(0, 0) -= m2.m(0, 0);
|
m1(0, 0) -= m2(0, 0);
|
||||||
m1->m(0, 1) -= m2.m(0, 1);
|
m1(0, 1) -= m2(0, 1);
|
||||||
m1->m(1, 0) -= m2.m(1, 0);
|
m1(1, 0) -= m2(1, 0);
|
||||||
m1->m(1, 1) -= m2.m(1, 1);
|
m1(1, 1) -= m2(1, 1);
|
||||||
|
|
||||||
return m1;
|
return m1;
|
||||||
}
|
}
|
||||||
@ -167,10 +185,10 @@ namespace Phanes::Core::Math {
|
|||||||
template<RealType T>
|
template<RealType T>
|
||||||
TMatrix2<T> operator*= (TMatrix2<T>& m1, T s)
|
TMatrix2<T> operator*= (TMatrix2<T>& m1, T s)
|
||||||
{
|
{
|
||||||
m1->m[0][0] *= s;
|
m1.data[0][0] *= s;
|
||||||
m1->m[0][1] *= s;
|
m1.data[0][1] *= s;
|
||||||
m1->m[1][0] *= s;
|
m1.data[1][0] *= s;
|
||||||
m1->m[1][1] *= s;
|
m1.data[1][1] *= s;
|
||||||
|
|
||||||
return m1;
|
return m1;
|
||||||
}
|
}
|
||||||
@ -189,6 +207,18 @@ namespace Phanes::Core::Math {
|
|||||||
return m1;
|
return m1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<RealType T>
|
||||||
|
TMatrix2<T> operator/= (TMatrix2<T>& m1, T s)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
template<RealType T>
|
template<RealType T>
|
||||||
TMatrix2<T> operator+ (const TMatrix2<T>& m1, T s)
|
TMatrix2<T> operator+ (const TMatrix2<T>& m1, T s)
|
||||||
{
|
{
|
||||||
@ -200,7 +230,7 @@ namespace Phanes::Core::Math {
|
|||||||
TMatrix2<T> operator+ (const TMatrix2<T>& m1, const TMatrix2<T>& m2)
|
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),
|
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));
|
m1(1, 0) + m2(1, 0), m1(1, 1) + m2(1, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<RealType T>
|
template<RealType T>
|
||||||
@ -221,21 +251,29 @@ namespace Phanes::Core::Math {
|
|||||||
TMatrix2<T> operator* (const TMatrix2<T>& m1, T s)
|
TMatrix2<T> operator* (const TMatrix2<T>& m1, T s)
|
||||||
{
|
{
|
||||||
return TMatrix2<T>(m1(0, 0) * s, m1(0, 1) * s,
|
return TMatrix2<T>(m1(0, 0) * s, m1(0, 1) * s,
|
||||||
m1(1, 0) * s, m1(1, 1) * s);
|
m1(1, 0) * s, m1(1, 1) * s);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<RealType T>
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<RealType T>
|
template<RealType T>
|
||||||
TMatrix2<T> operator* (const TMatrix2<T>& m1, const TMatrix2<T>& m2)
|
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),
|
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));
|
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>
|
template<RealType T>
|
||||||
TVector2<T, false> operator* (const TMatrix2<T>& m1, const TVector2<T, false>& v)
|
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,
|
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, 0) * v.x + m1(1, 1) * v.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<RealType T>
|
template<RealType T>
|
||||||
@ -258,28 +296,30 @@ namespace Phanes::Core::Math {
|
|||||||
template<RealType T>
|
template<RealType T>
|
||||||
T Determinant(const TMatrix2<T>& m1)
|
T Determinant(const TMatrix2<T>& m1)
|
||||||
{
|
{
|
||||||
return m1(0, 0) * m1(1, 1) - m1(0, 1) * m1(0, 1);
|
return m1(0, 0) * m1(1, 1) - m1(0, 1) * m1(1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<RealType T>
|
template<RealType T>
|
||||||
TMatrix2<T> InverseV(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);
|
float m00 = m1(0, 0);
|
||||||
|
|
||||||
m1(0, 0) = m1(1, 1);
|
m1(0, 0) = m1(1, 1);
|
||||||
m1(0, 1) = -m1(0, 1);
|
m1(0, 1) = -m1(0, 1);
|
||||||
m1(1, 0) = -m1(1, 0);
|
m1(1, 0) = -m1(1, 0);
|
||||||
m1(1, 1) = m00;
|
m1(1, 1) = m00;
|
||||||
|
|
||||||
m1 *= _1_det;
|
m1 *= _1_det;
|
||||||
return m1;
|
return m1;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<RealType T>
|
template<RealType T>
|
||||||
TMatrix2<T> TransposeV(TMatrix2<T>& m1)
|
TMatrix2<T> TransposeV(TMatrix2<T>& m1)
|
||||||
{
|
{
|
||||||
Swap(m1(0, 1), m1(1, 0));
|
Swap(m1(0, 1), m1(1, 0));
|
||||||
|
|
||||||
|
return m1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// =============== //
|
// =============== //
|
||||||
@ -289,24 +329,24 @@ namespace Phanes::Core::Math {
|
|||||||
template<RealType T>
|
template<RealType T>
|
||||||
TMatrix2<T> Inverse(TMatrix2<T>& m1)
|
TMatrix2<T> Inverse(TMatrix2<T>& m1)
|
||||||
{
|
{
|
||||||
float _1_det = 1.0f / Determinant(m1);
|
float _1_det = 1.0f / Determinant(m1);
|
||||||
|
|
||||||
return TMatrix2<T>(m1(1, 1) * _1_det, m1(1, 0) * _1_det,
|
return TMatrix2<T>( m1(1, 1) * _1_det, -m1(0, 1) * _1_det,
|
||||||
m1(0, 1) * _1_det, m1(0, 0) * _1_det);
|
-m1(1, 0) * _1_det, m1(0, 0) * _1_det);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<RealType T>
|
template<RealType T>
|
||||||
TMatrix2<T> Transpose(const TMatrix2<T>& m1)
|
TMatrix2<T> Transpose(const TMatrix2<T>& m1)
|
||||||
{
|
{
|
||||||
return TMatrix2<T>(m1(0, 0), m1(1, 0),
|
return TMatrix2<T>(m1(0, 0), m1(1, 0),
|
||||||
m1(0, 1), m1(1, 1));
|
m1(0, 1), m1(1, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<RealType T>
|
template<RealType T>
|
||||||
bool IsIndentityMatrix(const TMatrix2<T>& m1, T threshold = P_FLT_INAC)
|
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) - (T)1.0) < 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) - (T)1.0) < P_FLT_INAC && abs(m1(1, 1) - (T)1.0) < P_FLT_INAC);
|
abs(m1(1, 0)) < P_FLT_INAC && abs(m1(1, 1) - (T)1.0) < P_FLT_INAC);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // Phanes::Core::Math
|
} // Phanes::Core::Math
|
||||||
|
Loading…
x
Reference in New Issue
Block a user