Untitled
unknown
c_cpp
a year ago
4.6 kB
6
Indexable
#include <cassert>
#include <stdexcept>
#include <cmath>
#include "Matrix.h"
namespace dae {
Matrix::Matrix(const Vector3& xAxis, const Vector3& yAxis, const Vector3& zAxis, const Vector3& t) :
Matrix({ xAxis, 0 }, { yAxis, 0 }, { zAxis, 0 }, { t, 1 })
{
}
Matrix::Matrix(const Vector4& xAxis, const Vector4& yAxis, const Vector4& zAxis, const Vector4& t)
{
data[0] = xAxis;
data[1] = yAxis;
data[2] = zAxis;
data[3] = t;
}
Matrix::Matrix(const Matrix& m)
{
data[0] = m[0];
data[1] = m[1];
data[2] = m[2];
data[3] = m[3];
}
Vector3 Matrix::TransformVector(const Vector3& v) const
{
return TransformVector(v[0], v[1], v[2]);
}
Vector3 Matrix::TransformVector(float x, float y, float z) const
{
return Vector3{
data[0].x * x + data[1].x * y + data[2].x * z,
data[0].y * x + data[1].y * y + data[2].y * z,
data[0].z * x + data[1].z * y + data[2].z * z
};
}
Vector3 Matrix::TransformPoint(const Vector3& p) const
{
return TransformPoint(p[0], p[1], p[2]);
}
Vector3 Matrix::TransformPoint(float x, float y, float z) const
{
return Vector3{
data[0].x * x + data[1].x * y + data[2].x * z + data[3].x,
data[0].y * x + data[1].y * y + data[2].y * z + data[3].y,
data[0].z * x + data[1].z * y + data[2].z * z + data[3].z,
};
}
const Matrix& Matrix::Transpose()
{
Matrix result{};
for (int r{ 0 }; r < 4; ++r)
{
for (int c{ 0 }; c < 4; ++c)
{
result[r][c] = data[c][r];
}
}
data[0] = result[0];
data[1] = result[1];
data[2] = result[2];
data[3] = result[3];
return *this;
}
Matrix Matrix::Transpose(const Matrix& m)
{
Matrix out{ m };
out.Transpose();
return out;
}
Vector3 Matrix::GetAxisX() const
{
return data[0];
}
Vector3 Matrix::GetAxisY() const
{
return data[1];
}
Vector3 Matrix::GetAxisZ() const
{
return data[2];
}
Vector3 Matrix::GetTranslation() const
{
return data[3];
}
Matrix Matrix::CreateTranslation(float x, float y, float z)
{
Matrix tMatrix{ Vector4{1,0,0,0},
Vector4{0,1,0,0},
Vector4{0,0,1,0},
Vector4{x,y,z,1} };
return tMatrix;
}
Matrix Matrix::CreateTranslation(const Vector3& t)
{
return { Vector3::UnitX, Vector3::UnitY, Vector3::UnitZ, t };
}
Matrix Matrix::CreateRotationX(float pitch)
{
Matrix rMatrix{ Vector4{1,0,0,0},
Vector4{0,cos(pitch),sin(pitch),0},
Vector4{0,-sin(pitch),cos(pitch),0},
Vector4{0,0,0,1}};
return rMatrix;
}
Matrix Matrix::CreateRotationY(float yaw)
{
Matrix rMatrix{ Vector4{cos(yaw),0,-sin(yaw),0},
Vector4{0,1,0,0},
Vector4{sin(yaw),0,cos(yaw),0},
Vector4{0,0,0,1} };
return rMatrix;
}
Matrix Matrix::CreateRotationZ(float roll)
{
Matrix rMatrix{ Vector4{cos(roll),sin(roll),0,0},
Vector4{-sin(roll),cos(roll),0,0},
Vector4{0,0,1,0},
Vector4{0,0,0,1} };
return rMatrix;
}
Matrix Matrix::CreateRotation(const Vector3& r)
{
Matrix rMatrix{ CreateRotationX(r.x) * CreateRotationY(r.y) * CreateRotationZ(r.z)};
return rMatrix;
}
Matrix Matrix::CreateRotation(float pitch, float yaw, float roll)
{
return CreateRotation({ pitch, yaw, roll });
}
Matrix Matrix::CreateScale(float sx, float sy, float sz)
{
Matrix sMatrix{ Vector4{sx,0,0,0},
Vector4{0,sy,0,0},
Vector4{0,0,sz,0},
Vector4{0,0,0,1} };
return sMatrix;
}
Matrix Matrix::CreateScale(const Vector3& s)
{
return CreateScale(s[0], s[1], s[2]);
}
#pragma region Operator Overloads
Vector4& Matrix::operator[](int index)
{
assert(index <= 3 && index >= 0);
return data[index];
}
Vector4 Matrix::operator[](int index) const
{
assert(index <= 3 && index >= 0);
return data[index];
}
Matrix Matrix::operator*(const Matrix& m) const
{
Matrix result{};
Matrix m_transposed = Transpose(m);
for (int r{ 0 }; r < 4; ++r)
{
for (int c{ 0 }; c < 4; ++c)
{
result[r][c] = Vector4::Dot(data[r], m_transposed[c]);
}
}
return result;
}
const Matrix& Matrix::operator*=(const Matrix& m)
{
Matrix copy{ *this };
Matrix m_transposed = Transpose(m);
for (int r{ 0 }; r < 4; ++r)
{
for (int c{ 0 }; c < 4; ++c)
{
data[r][c] = Vector4::Dot(copy[r], m_transposed[c]);
}
}
return *this;
}
bool Matrix::operator==(const Matrix& m) const
{
return data[0] == m.data[0]
&& data[1] == m.data[1]
&& data[2] == m.data[2]
&& data[3] == m.data[3];
}
#pragma endregion
}Editor is loading...
Leave a Comment