Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
#include "CRmat3.h"
#include "iostream"
namespace CR217
{
CR217::CRmat3::CRmat3()
{
// 3x3 matrix - column major. X vector is 0, 1, 2, etc, (openGL prefer way)
// 0 3 6
// 1 4 7
// 2 5 8
for (int i = 0; i < 9; i++)
{
matrixData[i] = 0.0f;
}
matrixData[0] = matrixData[4] = matrixData[8] = 1.0f;
};
CR217::CRmat3::CRmat3(float m0, float m1, float m2, float m3, float m4, float m5, float m6, float m7, float m8)
{
// 3x3 matrix - column major. X vector is 0, 1, 2, etc, (openGL prefer way)
// 0 3 6
// 1 4 7
// 2 5 8
matrixData[0] = m0;
matrixData[3] = m3;
matrixData[6] = m6;
matrixData[1] = m1;
matrixData[4] = m4;
matrixData[7] = m7;
matrixData[2] = m2;
matrixData[5] = m5;
matrixData[8] = m8;
}
CR217::CRmat3& CR217::CRmat3::operator=(const CRmat3& value)
{
for (int i = 0; i < 9; i++) {
matrixData[i] = value.matrixData[i];
}
return *this;
}
CR217::CRmat3& CR217::CRmat3::operator+(const CRmat3& m) const
{
CRmat3 n;
// 3x3 matrix - column major. X vector is 0, 1, 2, etc, (openGL prefer way)
// 0 3 6
// 1 4 7
// 2 5 8
n.matrixData[0] = matrixData[0] + m.matrixData[0];
n.matrixData[3] = matrixData[3] + m.matrixData[3];
n.matrixData[6] = matrixData[6] + m.matrixData[6];
n.matrixData[1] = matrixData[1] + m.matrixData[1];
n.matrixData[4] = matrixData[4] + m.matrixData[4];
n.matrixData[7] = matrixData[7] + m.matrixData[7];
n.matrixData[2] = matrixData[2] + m.matrixData[2];
n.matrixData[5] = matrixData[5] + m.matrixData[5];
n.matrixData[8] = matrixData[8] + m.matrixData[8];
return n;
}
void CRmat3::operator+=(const CRmat3& m)
{
// 3x3 matrix - column major. X vector is 0, 1, 2, etc, (openGL prefer way)
// 0 3 6
// 1 4 7
// 2 5 8
matrixData[0] += m.matrixData[0];
matrixData[3] += m.matrixData[3];
matrixData[6] += m.matrixData[6];
matrixData[1] += m.matrixData[1];
matrixData[4] += m.matrixData[4];
matrixData[7] += m.matrixData[7];
matrixData[2] += m.matrixData[2];
matrixData[5] += m.matrixData[5];
matrixData[8] += m.matrixData[8];
}
CR217::CRmat3& CR217::CRmat3::operator*(const float s) const
{
CRmat3 n;
// 3x3 matrix - column major. X vector is 0, 1, 2, etc, (openGL prefer way)
// 0 3 6
// 1 4 7
// 2 5 8
n.matrixData[0] = matrixData[0] * s;
n.matrixData[3] = matrixData[3] * s;
n.matrixData[6] = matrixData[6] * s;
n.matrixData[1] = matrixData[1] * s;
n.matrixData[4] = matrixData[4] * s;
n.matrixData[7] = matrixData[7] * s;
n.matrixData[2] = matrixData[2] * s;
n.matrixData[5] = matrixData[5] * s;
n.matrixData[8] = matrixData[8] * s;
return n;
}
void CRmat3::operator*=(const float s)
{
// 3x3 matrix - column major. X vector is 0, 1, 2, etc, (openGL prefer way)
// 0 3 6
// 1 4 7
// 2 5 8
matrixData[0] *= s;
matrixData[3] *= s;
matrixData[6] *= s;
matrixData[1] *= s;
matrixData[4] *= s;
matrixData[7] *= s;
matrixData[2] *= s;
matrixData[5] *= s;
matrixData[8] *= s;
}
CR217::CRmat3 CRmat3::operator*(const CRmat3& m) const
{
// 3x3 matrix - column major. X vector is 0, 1, 2, etc, (openGL prefer way)
// 0 3 6
// 1 4 7
// 2 5 8
return CRmat3(matrixData[0] * m.matrixData[0] + matrixData[3] * m.matrixData[1] + matrixData[6] * m.matrixData[2],
matrixData[0] * m.matrixData[3] + matrixData[3] * m.matrixData[4] + matrixData[6] * m.matrixData[5],
matrixData[0] * m.matrixData[6] + matrixData[3] * m.matrixData[7] + matrixData[6] * m.matrixData[8],
matrixData[1] * m.matrixData[0] + matrixData[4] * m.matrixData[1] + matrixData[7] * m.matrixData[2],
matrixData[1] * m.matrixData[3] + matrixData[4] * m.matrixData[4] + matrixData[7] * m.matrixData[5],
matrixData[1] * m.matrixData[6] + matrixData[4] * m.matrixData[7] + matrixData[7] * m.matrixData[8],
matrixData[2] * m.matrixData[0] + matrixData[5] * m.matrixData[1] + matrixData[8] * m.matrixData[2],
matrixData[2] * m.matrixData[3] + matrixData[5] * m.matrixData[4] + matrixData[8] * m.matrixData[5],
matrixData[2] * m.matrixData[6] + matrixData[5] * m.matrixData[7] + matrixData[8] * m.matrixData[8]);
}
void CRmat3::operator*=(const CRmat3& m)
{
// 3x3 matrix - column major. X vector is 0, 1, 2, etc, (openGL prefer way)
// 0 3 6
// 1 4 7
// 2 5 8
float t1;
float t2;
float t3;
t1 = matrixData[0] * m.matrixData[0] + matrixData[3] * m.matrixData[1] + matrixData[6] * m.matrixData[2];
t2 = matrixData[0] * m.matrixData[3] + matrixData[3] * m.matrixData[4] + matrixData[6] * m.matrixData[5];
t3 = matrixData[0] * m.matrixData[6] + matrixData[3] * m.matrixData[7] + matrixData[6] * m.matrixData[8];
matrixData[0] = t1;
matrixData[3] = t2;
matrixData[6] = t3;
t1 = matrixData[0] * m.matrixData[0] + matrixData[4] * m.matrixData[1] + matrixData[7] * m.matrixData[2];
t2 = matrixData[0] * m.matrixData[3] + matrixData[4] * m.matrixData[4] + matrixData[7] * m.matrixData[5];
t3 = matrixData[0] * m.matrixData[6] + matrixData[4] * m.matrixData[7] + matrixData[7] * m.matrixData[8];
matrixData[1] = t1;
matrixData[4] = t2;
matrixData[7] = t3;
t1 = matrixData[0] * m.matrixData[0] + matrixData[5] * m.matrixData[1] + matrixData[8] * m.matrixData[2];
t2 = matrixData[0] * m.matrixData[3] + matrixData[5] * m.matrixData[4] + matrixData[8] * m.matrixData[5];
t3 = matrixData[0] * m.matrixData[6] + matrixData[5] * m.matrixData[7] + matrixData[8] * m.matrixData[8];
matrixData[2] = t1;
matrixData[5] = t2;
matrixData[8] = t3;
}
void CRmat3::setMatrixAsIdentityMatrix()
{
for (int i = 0; i < 9; i++)
{
matrixData[i] = 0.0f;
matrixData[0] = matrixData[4] = matrixData[8] = 1.0f;
}
}
void CRmat3::setMatrixSaInverseOfGivenMatrix(const CRmat3& m)
{
// 3x3 matrix - column major. X vector is 0, 1, 2, etc, (openGL prefer way)
// 0 3 6
// 1 4 7
// 2 5 8
float t1 = m.matrixData[0] * m.matrixData[4];
float t2 = m.matrixData[0] * m.matrixData[7];
float t3 = m.matrixData[3] * m.matrixData[1];
float t4 = m.matrixData[6] * m.matrixData[1];
float t5 = m.matrixData[3] * m.matrixData[2];
float t6 = m.matrixData[6] * m.matrixData[2];
float det = (t1 * m.matrixData[8] - t2 * m.matrixData[5] - t3 * m.matrixData[8] + t4 * m.matrixData[5] + t6 * m.matrixData[7] - t6 * m.matrixData[4]);
if (det == 0.0) return;
float invd = 1.0f / det;
float m0 = (m.matrixData[4] * m.matrixData[8] - m.matrixData[7] * m.matrixData[5]) * invd;
float m3 =- (m.matrixData[3] * m.matrixData[8] - m.matrixData[6] * m.matrixData[5]) * invd;
float m6 =- (m.matrixData[3] * m.matrixData[7] - m.matrixData[6] * m.matrixData[4]) * invd;
float m1 =- (m.matrixData[1] * m.matrixData[8] - m.matrixData[7] * m.matrixData[2]) * invd;
float m4 = -(m.matrixData[0] * m.matrixData[8] - t6) * invd;
float m7 =- (t2 - t4) * invd;
float m2 = (m.matrixData[1] * m.matrixData[5] - m.matrixData[4] * m.matrixData[2]) * invd;
float m5 = -(m.matrixData[0] * m.matrixData[5] - t5) * invd;
float m8 = (t1 - t3) * invd;
matrixData[0] = m0;
matrixData[3] = m3;
matrixData[6] = m6;
matrixData[1] = m1;
matrixData[4] = m4;
matrixData[7] = m7;
matrixData[2] = m2;
matrixData[5] = m5;
matrixData[8] = m8;
}
CR217::CRmat3 CRmat3::getInverseOfMatrix() const
{
CRmat3 result;
result.setMatrixSaInverseOfGivenMatrix(*this);
return result;
}
void CRmat3::invertMatrix()
{
setMatrixSaInverseOfGivenMatrix(*this);
}
void CRmat3::setMatrixAsTransposeOfGivenMatrix(const CRmat3& m)
{
// 3x3 matrix
// 0 3 6
// 1 4 7
// 2 5 8
// 3x3 transpose
// 0 1 2
// 3 4 5
// 6 7 8
matrixData[0] = m.matrixData[0];
matrixData[3] = m.matrixData[1];
matrixData[6] = m.matrixData[2];
matrixData[1] = m.matrixData[3];
matrixData[4] = m.matrixData[4];
matrixData[7] = m.matrixData[5];
matrixData[2] = m.matrixData[6];
matrixData[5] = m.matrixData[7];
matrixData[8] = m.matrixData[8];
}
CR217::CRmat3 CRmat3::getTransposeOfMatrix() const
{
CRmat3 result;
result.setMatrixAsTransposeOfGivenMatrix(*this);
return result;
}
CR217::CRVec3 CRmat3::operator*(const CRVec3& v) const
{
// 3x3 matrix - column major. X vector is 0, 1, 2, etc, (openGL prefer way)
// 0 3 6
// 1 4 7
// 2 5 8
return CRVec3(matrixData[0] * v.x + matrixData[3] * v.y + matrixData[6] * v.z,
matrixData[1] * v.x + matrixData[4] * v.y + matrixData[7] * v.z,
matrixData[2] * v.x + matrixData[5] * v.y + matrixData[8] * v.z);
}
CR217::CRVec3 CRmat3::transformVectorByMatrix(const CRVec3& v) const
{
return (*this) * v;
}
CR217::CRmat3::~CRmat3()
{
}
}