#ifdef MATRIX_H_ // since the .cpp file has to be included by the .hpp file this // will evaluate to true #include "Vector3D.hpp" template constexpr V3D::V3D(const Matrix<1, 3> &other) : x(other[0][0]), y(other[0][1]), z(other[0][2]) {} template constexpr V3D::V3D(const Matrix<3, 1> &other) : x(other[0][0]), y(other[1][0]), z(other[2][0]) {} template constexpr V3D::V3D(const V3D &other) : x(other.x), y(other.y), z(other.z) { static_assert(std::is_arithmetic::value, "Type must be a number"); } template constexpr V3D::V3D(Type x = 0, Type y = 0, Type z = 0) : x(x), y(y), z(z) { static_assert(std::is_arithmetic::value, "Type must be a number"); } template constexpr V3D::V3D(const V3D other) : x(static_cast(other.x)), y(static_cast(other.y)), z(static_cast(other.z)) { static_assert(std::is_arithmetic::value, "Type must be a number"); static_assert(std::is_arithmetic::value, "OtherType must be a number"); } template std::array V3D::ToArray() { return {this->x, this->y, this->z}; } template V3D &V3D::operator=(const V3D &other) { this->x = other.x; this->y = other.y; this->z = other.z; return *this; } template V3D &V3D::operator+=(const V3D &other) { this->x += other.x; this->y += other.y; this->z += other.z; return *this; } template V3D &V3D::operator-=(const V3D &other) { this->x -= other.x; this->y -= other.y; this->z -= other.z; return *this; } template V3D &V3D::operator/=(const Type scalar) { if (scalar == 0) { return *this; } this->x /= scalar; this->y /= scalar; this->z /= scalar; return *this; } template V3D &V3D::operator*=(const Type scalar) { this->x *= scalar; this->y *= scalar; this->z *= scalar; return *this; } template bool V3D::operator==(const V3D &other) { return this->x == other.x && this->y == other.y && this->z == other.z; } template float V3D::magnitude() { return std::sqrt(static_cast(this->x * this->x + this->y * this->y + this->z * this->z)); } #endif // MATRIX_H_