📄 wm4matrix3.inl
字号:
template <class Real>
inline Matrix3<Real> Matrix3<Real>::operator+ (const Matrix3& rkM) const
{
return Matrix3<Real>(
m_afEntry[0] + rkM.m_afEntry[0],
m_afEntry[1] + rkM.m_afEntry[1],
m_afEntry[2] + rkM.m_afEntry[2],
m_afEntry[3] + rkM.m_afEntry[3],
m_afEntry[4] + rkM.m_afEntry[4],
m_afEntry[5] + rkM.m_afEntry[5],
m_afEntry[6] + rkM.m_afEntry[6],
m_afEntry[7] + rkM.m_afEntry[7],
m_afEntry[8] + rkM.m_afEntry[8]);
}
//----------------------------------------------------------------------------
template <class Real>
inline Matrix3<Real> Matrix3<Real>::operator- (const Matrix3& rkM) const
{
return Matrix3<Real>(
m_afEntry[0] - rkM.m_afEntry[0],
m_afEntry[1] - rkM.m_afEntry[1],
m_afEntry[2] - rkM.m_afEntry[2],
m_afEntry[3] - rkM.m_afEntry[3],
m_afEntry[4] - rkM.m_afEntry[4],
m_afEntry[5] - rkM.m_afEntry[5],
m_afEntry[6] - rkM.m_afEntry[6],
m_afEntry[7] - rkM.m_afEntry[7],
m_afEntry[8] - rkM.m_afEntry[8]);
}
//----------------------------------------------------------------------------
template <class Real>
inline Matrix3<Real> Matrix3<Real>::operator* (const Matrix3& rkM) const
{
return Matrix3<Real>(
m_afEntry[0]*rkM.m_afEntry[0] +
m_afEntry[1]*rkM.m_afEntry[3] +
m_afEntry[2]*rkM.m_afEntry[6],
m_afEntry[0]*rkM.m_afEntry[1] +
m_afEntry[1]*rkM.m_afEntry[4] +
m_afEntry[2]*rkM.m_afEntry[7],
m_afEntry[0]*rkM.m_afEntry[2] +
m_afEntry[1]*rkM.m_afEntry[5] +
m_afEntry[2]*rkM.m_afEntry[8],
m_afEntry[3]*rkM.m_afEntry[0] +
m_afEntry[4]*rkM.m_afEntry[3] +
m_afEntry[5]*rkM.m_afEntry[6],
m_afEntry[3]*rkM.m_afEntry[1] +
m_afEntry[4]*rkM.m_afEntry[4] +
m_afEntry[5]*rkM.m_afEntry[7],
m_afEntry[3]*rkM.m_afEntry[2] +
m_afEntry[4]*rkM.m_afEntry[5] +
m_afEntry[5]*rkM.m_afEntry[8],
m_afEntry[6]*rkM.m_afEntry[0] +
m_afEntry[7]*rkM.m_afEntry[3] +
m_afEntry[8]*rkM.m_afEntry[6],
m_afEntry[6]*rkM.m_afEntry[1] +
m_afEntry[7]*rkM.m_afEntry[4] +
m_afEntry[8]*rkM.m_afEntry[7],
m_afEntry[6]*rkM.m_afEntry[2] +
m_afEntry[7]*rkM.m_afEntry[5] +
m_afEntry[8]*rkM.m_afEntry[8]);
}
//----------------------------------------------------------------------------
template <class Real>
inline Matrix3<Real> Matrix3<Real>::operator* (Real fScalar) const
{
return Matrix3<Real>(
fScalar*m_afEntry[0],
fScalar*m_afEntry[1],
fScalar*m_afEntry[2],
fScalar*m_afEntry[3],
fScalar*m_afEntry[4],
fScalar*m_afEntry[5],
fScalar*m_afEntry[6],
fScalar*m_afEntry[7],
fScalar*m_afEntry[8]);
}
//----------------------------------------------------------------------------
template <class Real>
inline Matrix3<Real> Matrix3<Real>::operator/ (Real fScalar) const
{
if (fScalar != (Real)0.0)
{
Real fInvScalar = ((Real)1.0)/fScalar;
return Matrix3<Real>(
fInvScalar*m_afEntry[0],
fInvScalar*m_afEntry[1],
fInvScalar*m_afEntry[2],
fInvScalar*m_afEntry[3],
fInvScalar*m_afEntry[4],
fInvScalar*m_afEntry[5],
fInvScalar*m_afEntry[6],
fInvScalar*m_afEntry[7],
fInvScalar*m_afEntry[8]);
}
return Matrix3<Real>(
Math<Real>::MAX_REAL,
Math<Real>::MAX_REAL,
Math<Real>::MAX_REAL,
Math<Real>::MAX_REAL,
Math<Real>::MAX_REAL,
Math<Real>::MAX_REAL,
Math<Real>::MAX_REAL,
Math<Real>::MAX_REAL,
Math<Real>::MAX_REAL);
}
//----------------------------------------------------------------------------
template <class Real>
inline Matrix3<Real> Matrix3<Real>::operator- () const
{
return Matrix3<Real>(
-m_afEntry[0],
-m_afEntry[1],
-m_afEntry[2],
-m_afEntry[3],
-m_afEntry[4],
-m_afEntry[5],
-m_afEntry[6],
-m_afEntry[7],
-m_afEntry[8]);
}
//----------------------------------------------------------------------------
template <class Real>
inline Matrix3<Real>& Matrix3<Real>::operator+= (const Matrix3& rkM)
{
m_afEntry[0] += rkM.m_afEntry[0];
m_afEntry[1] += rkM.m_afEntry[1];
m_afEntry[2] += rkM.m_afEntry[2];
m_afEntry[3] += rkM.m_afEntry[3];
m_afEntry[4] += rkM.m_afEntry[4];
m_afEntry[5] += rkM.m_afEntry[5];
m_afEntry[6] += rkM.m_afEntry[6];
m_afEntry[7] += rkM.m_afEntry[7];
m_afEntry[8] += rkM.m_afEntry[8];
return *this;
}
//----------------------------------------------------------------------------
template <class Real>
inline Matrix3<Real>& Matrix3<Real>::operator-= (const Matrix3& rkM)
{
m_afEntry[0] -= rkM.m_afEntry[0];
m_afEntry[1] -= rkM.m_afEntry[1];
m_afEntry[2] -= rkM.m_afEntry[2];
m_afEntry[3] -= rkM.m_afEntry[3];
m_afEntry[4] -= rkM.m_afEntry[4];
m_afEntry[5] -= rkM.m_afEntry[5];
m_afEntry[6] -= rkM.m_afEntry[6];
m_afEntry[7] -= rkM.m_afEntry[7];
m_afEntry[8] -= rkM.m_afEntry[8];
return *this;
}
//----------------------------------------------------------------------------
template <class Real>
inline Matrix3<Real>& Matrix3<Real>::operator*= (Real fScalar)
{
m_afEntry[0] *= fScalar;
m_afEntry[1] *= fScalar;
m_afEntry[2] *= fScalar;
m_afEntry[3] *= fScalar;
m_afEntry[4] *= fScalar;
m_afEntry[5] *= fScalar;
m_afEntry[6] *= fScalar;
m_afEntry[7] *= fScalar;
m_afEntry[8] *= fScalar;
return *this;
}
//----------------------------------------------------------------------------
template <class Real>
inline Matrix3<Real>& Matrix3<Real>::operator/= (Real fScalar)
{
if (fScalar != (Real)0.0)
{
Real fInvScalar = ((Real)1.0)/fScalar;
m_afEntry[0] *= fInvScalar;
m_afEntry[1] *= fInvScalar;
m_afEntry[2] *= fInvScalar;
m_afEntry[3] *= fInvScalar;
m_afEntry[4] *= fInvScalar;
m_afEntry[5] *= fInvScalar;
m_afEntry[6] *= fInvScalar;
m_afEntry[7] *= fInvScalar;
m_afEntry[8] *= fInvScalar;
}
else
{
m_afEntry[0] = Math<Real>::MAX_REAL;
m_afEntry[1] = Math<Real>::MAX_REAL;
m_afEntry[2] = Math<Real>::MAX_REAL;
m_afEntry[3] = Math<Real>::MAX_REAL;
m_afEntry[4] = Math<Real>::MAX_REAL;
m_afEntry[5] = Math<Real>::MAX_REAL;
m_afEntry[6] = Math<Real>::MAX_REAL;
m_afEntry[7] = Math<Real>::MAX_REAL;
m_afEntry[8] = Math<Real>::MAX_REAL;
}
return *this;
}
//----------------------------------------------------------------------------
template <class Real>
inline Vector3<Real> Matrix3<Real>::operator* (const Vector3<Real>& rkV) const
{
return Vector3<Real>(
m_afEntry[0]*rkV[0] + m_afEntry[1]*rkV[1] + m_afEntry[2]*rkV[2],
m_afEntry[3]*rkV[0] + m_afEntry[4]*rkV[1] + m_afEntry[5]*rkV[2],
m_afEntry[6]*rkV[0] + m_afEntry[7]*rkV[1] + m_afEntry[8]*rkV[2]);
}
//----------------------------------------------------------------------------
template <class Real>
Matrix3<Real> Matrix3<Real>::Transpose () const
{
return Matrix3<Real>(
m_afEntry[0],
m_afEntry[3],
m_afEntry[6],
m_afEntry[1],
m_afEntry[4],
m_afEntry[7],
m_afEntry[2],
m_afEntry[5],
m_afEntry[8]);
}
//----------------------------------------------------------------------------
template <class Real>
Matrix3<Real> Matrix3<Real>::TransposeTimes (const Matrix3& rkM) const
{
// P = A^T*B
return Matrix3<Real>(
m_afEntry[0]*rkM.m_afEntry[0] +
m_afEntry[3]*rkM.m_afEntry[3] +
m_afEntry[6]*rkM.m_afEntry[6],
m_afEntry[0]*rkM.m_afEntry[1] +
m_afEntry[3]*rkM.m_afEntry[4] +
m_afEntry[6]*rkM.m_afEntry[7],
m_afEntry[0]*rkM.m_afEntry[2] +
m_afEntry[3]*rkM.m_afEntry[5] +
m_afEntry[6]*rkM.m_afEntry[8],
m_afEntry[1]*rkM.m_afEntry[0] +
m_afEntry[4]*rkM.m_afEntry[3] +
m_afEntry[7]*rkM.m_afEntry[6],
m_afEntry[1]*rkM.m_afEntry[1] +
m_afEntry[4]*rkM.m_afEntry[4] +
m_afEntry[7]*rkM.m_afEntry[7],
m_afEntry[1]*rkM.m_afEntry[2] +
m_afEntry[4]*rkM.m_afEntry[5] +
m_afEntry[7]*rkM.m_afEntry[8],
m_afEntry[2]*rkM.m_afEntry[0] +
m_afEntry[5]*rkM.m_afEntry[3] +
m_afEntry[8]*rkM.m_afEntry[6],
m_afEntry[2]*rkM.m_afEntry[1] +
m_afEntry[5]*rkM.m_afEntry[4] +
m_afEntry[8]*rkM.m_afEntry[7],
m_afEntry[2]*rkM.m_afEntry[2] +
m_afEntry[5]*rkM.m_afEntry[5] +
m_afEntry[8]*rkM.m_afEntry[8]);
}
//----------------------------------------------------------------------------
template <class Real>
Matrix3<Real> Matrix3<Real>::TimesTranspose (const Matrix3& rkM) const
{
// P = A*B^T
return Matrix3<Real>(
m_afEntry[0]*rkM.m_afEntry[0] +
m_afEntry[1]*rkM.m_afEntry[1] +
m_afEntry[2]*rkM.m_afEntry[2],
m_afEntry[0]*rkM.m_afEntry[3] +
m_afEntry[1]*rkM.m_afEntry[4] +
m_afEntry[2]*rkM.m_afEntry[5],
m_afEntry[0]*rkM.m_afEntry[6] +
m_afEntry[1]*rkM.m_afEntry[7] +
m_afEntry[2]*rkM.m_afEntry[8],
m_afEntry[3]*rkM.m_afEntry[0] +
m_afEntry[4]*rkM.m_afEntry[1] +
m_afEntry[5]*rkM.m_afEntry[2],
m_afEntry[3]*rkM.m_afEntry[3] +
m_afEntry[4]*rkM.m_afEntry[4] +
m_afEntry[5]*rkM.m_afEntry[5],
m_afEntry[3]*rkM.m_afEntry[6] +
m_afEntry[4]*rkM.m_afEntry[7] +
m_afEntry[5]*rkM.m_afEntry[8],
m_afEntry[6]*rkM.m_afEntry[0] +
m_afEntry[7]*rkM.m_afEntry[1] +
m_afEntry[8]*rkM.m_afEntry[2],
m_afEntry[6]*rkM.m_afEntry[3] +
m_afEntry[7]*rkM.m_afEntry[4] +
m_afEntry[8]*rkM.m_afEntry[5],
m_afEntry[6]*rkM.m_afEntry[6] +
m_afEntry[7]*rkM.m_afEntry[7] +
m_afEntry[8]*rkM.m_afEntry[8]);
}
//----------------------------------------------------------------------------
template <class Real>
Matrix3<Real> Matrix3<Real>::Inverse () const
{
// Invert a 3x3 using cofactors. This is faster than using a generic
// Gaussian elimination because of the loop overhead of such a method.
Matrix3 kInverse;
kInverse.m_afEntry[0] =
m_afEntry[4]*m_afEntry[8] - m_afEntry[5]*m_afEntry[7];
kInverse.m_afEntry[1] =
m_afEntry[2]*m_afEntry[7] - m_afEntry[1]*m_afEntry[8];
kInverse.m_afEntry[2] =
m_afEntry[1]*m_afEntry[5] - m_afEntry[2]*m_afEntry[4];
kInverse.m_afEntry[3] =
m_afEntry[5]*m_afEntry[6] - m_afEntry[3]*m_afEntry[8];
kInverse.m_afEntry[4] =
m_afEntry[0]*m_afEntry[8] - m_afEntry[2]*m_afEntry[6];
kInverse.m_afEntry[5] =
m_afEntry[2]*m_afEntry[3] - m_afEntry[0]*m_afEntry[5];
kInverse.m_afEntry[6] =
m_afEntry[3]*m_afEntry[7] - m_afEntry[4]*m_afEntry[6];
kInverse.m_afEntry[7] =
m_afEntry[1]*m_afEntry[6] - m_afEntry[0]*m_afEntry[7];
kInverse.m_afEntry[8] =
m_afEntry[0]*m_afEntry[4] - m_afEntry[1]*m_afEntry[3];
Real fDet =
m_afEntry[0]*kInverse.m_afEntry[0] +
m_afEntry[1]*kInverse.m_afEntry[3] +
m_afEntry[2]*kInverse.m_afEntry[6];
if (Math<Real>::FAbs(fDet) <= Math<Real>::ZERO_TOLERANCE)
{
return ZERO;
}
Real fInvDet = ((Real)1.0)/fDet;
kInverse.m_afEntry[0] *= fInvDet;
kInverse.m_afEntry[1] *= fInvDet;
kInverse.m_afEntry[2] *= fInvDet;
kInverse.m_afEntry[3] *= fInvDet;
kInverse.m_afEntry[4] *= fInvDet;
kInverse.m_afEntry[5] *= fInvDet;
kInverse.m_afEntry[6] *= fInvDet;
kInverse.m_afEntry[7] *= fInvDet;
kInverse.m_afEntry[8] *= fInvDet;
return kInverse;
}
//----------------------------------------------------------------------------
template <class Real>
Matrix3<Real> Matrix3<Real>::Adjoint () const
{
return Matrix3<Real>(
m_afEntry[4]*m_afEntry[8] - m_afEntry[5]*m_afEntry[7],
m_afEntry[2]*m_afEntry[7] - m_afEntry[1]*m_afEntry[8],
m_afEntry[1]*m_afEntry[5] - m_afEntry[2]*m_afEntry[4],
m_afEntry[5]*m_afEntry[6] - m_afEntry[3]*m_afEntry[8],
m_afEntry[0]*m_afEntry[8] - m_afEntry[2]*m_afEntry[6],
m_afEntry[2]*m_afEntry[3] - m_afEntry[0]*m_afEntry[5],
m_afEntry[3]*m_afEntry[7] - m_afEntry[4]*m_afEntry[6],
m_afEntry[1]*m_afEntry[6] - m_afEntry[0]*m_afEntry[7],
m_afEntry[0]*m_afEntry[4] - m_afEntry[1]*m_afEntry[3]);
}
//----------------------------------------------------------------------------
template <class Real>
Real Matrix3<Real>::Determinant () const
{
Real fCo00 = m_afEntry[4]*m_afEntry[8] - m_afEntry[5]*m_afEntry[7];
Real fCo10 = m_afEntry[5]*m_afEntry[6] - m_afEntry[3]*m_afEntry[8];
Real fCo20 = m_afEntry[3]*m_afEntry[7] - m_afEntry[4]*m_afEntry[6];
Real fDet = m_afEntry[0]*fCo00 + m_afEntry[1]*fCo10 + m_afEntry[2]*fCo20;
return fDet;
}
//----------------------------------------------------------------------------
template <class Real>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -