Permalink
Cannot retrieve contributors at this time
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?
Viktor-Kolaric-ID.8311933-217CR-Resit-Assignment/CRmat3.cpp
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
326 lines (247 sloc)
8.75 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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() | |
{ | |
} | |
} | |