Missing files

This commit is contained in:
Balhau 2023-06-19 17:54:09 +01:00
parent dce40559d6
commit 3f79338304
5 changed files with 351 additions and 30 deletions

View file

@ -5,6 +5,8 @@
using namespace engine::math;
using namespace std;
#define is_true(n) ((n == true) ? "yes" : "no")
int main() {
vector3d v1 = vector3d(1, 2, 3);
vector3d v2 = vector3d(3, 2, 1);
@ -14,16 +16,126 @@ int main() {
cout << v2 << endl;
cout << (v1 - v2) + v3 << endl;
cout << -v1 << endl;
cout << vector3d::Magnitude(v1) << endl;
cout << vector3d::Normalize(v1) << endl;
cout << vector3d::Magnitude(v3) << endl;
cout << vector3d::Normalize(v3) << endl;
cout << vector3d::norm(v1) << endl;
cout << vector3d::normalize(v1) << endl;
cout << vector3d::norm(v3) << endl;
cout << vector3d::normalize(v3) << endl;
engine::math::matrix3d m = engine::math::matrix3d();
engine::math::matrix3d id = matrix3d::Identity();
engine::math::matrix3d id = matrix3d::id();
cout << m << endl;
cout << m[0][0] << endl;
cout << id << endl;
cout << id[0][0] << id[1][1] << id[2][2] << endl;
cout << id(0, 0) << id(0, 1) << id(0, 2) << endl;
matrix3d m1 = matrix3d(v1, v2, v3);
matrix3d m2 = matrix3d(v3, v2, v1);
cout << matrix3d::id() + matrix3d::id() << endl;
cout << m1 * id << endl;
cout << id * m1 << endl;
cout << id * id << endl;
cout << m1 * m2 << endl;
cout << (id * 3.0f) * v1 << endl;
cout << v1 * (id * 3.0f) << endl;
matrix3d m3(1, 2, 3, 4, 5, 6, 7, 8, 9);
cout << endl << m3 << endl;
cout << endl << matrix3d::trans(m3) << endl;
cout << "Are " << m1 << " and " << m2 << " equals? "
<< is_true(matrix3d::equals(m1, m2)) << endl;
cout << "Are " << m2 << " and " << m2 << " equals? "
<< is_true(matrix3d::equals(m2, m2)) << endl;
// Validate matrix properties
cout << "Associative law for matrix add holds: "
<< is_true(matrix3d::equals((m1 + m2) + id, m1 + (m2 + id))) << endl;
cout << "Comutative law for add holds: "
<< is_true(matrix3d::equals(m1 + m2, m2 + m1)) << endl;
cout << "Associative for scalar multiplication: "
<< is_true(matrix3d::equals((2.0f * 2.0f) * m1, 2.0f * (2.0f * m1)))
<< endl;
cout << "Comutative law for scalar multiplication: "
<< is_true(matrix3d::equals(2 * m1, m1 * 2)) << endl;
cout << "Distributive law for scalar multiplication: "
<< is_true(matrix3d::equals((2 + 2) * m1, 2 * m1 + 2 * m1)) << endl;
cout << "Associative for matrix multiplication: "
<< is_true(matrix3d::equals((m1 * m2) * m3, m1 * (m2 * m3))) << endl;
cout << "Distributive laws for matrix: "
<< is_true(matrix3d::equals(m1 * (m2 + m3), m1 * m2 + m1 * m3))
<< " and "
<< is_true(matrix3d::equals((m1 + m2) * m3, m1 * m3 + m2 * m3)) << endl;
cout << "Scalar factorization for matrices: "
<< is_true(matrix3d::equals((3 * m1) * m2, m1 * (3 * m2))) << " and "
<< is_true(matrix3d::equals((3 * m1) * m2, 3 * (m1 * m2))) << endl;
cout << "Product rule for matrix trans: "
<< is_true(matrix3d::equals(matrix3d::trans(m1 * m2),
matrix3d::trans(m2) * matrix3d::trans(m1)))
<< endl;
cout << "Dot product comutative law: "
<< is_true(vector3d::dot(v1, v2) == vector3d::dot(v2, v1)) << endl;
cout << "Dot product distributive law: "
<< is_true(vector3d::dot(v1, (v2 + v3)) ==
(vector3d::dot(v1, v2) + vector3d::dot(v1, v3)))
<< endl;
cout << "Dot scalar factorization: "
<< is_true(vector3d::dot(2.0 * v1, v2) == vector3d::dot(v1, 2 * v2))
<< " and "
<< is_true(vector3d::dot(v1, 2 * v2) == 2 * vector3d::dot(v1, v2))
<< endl;
cout << "Cross anticomutativity: "
<< is_true(vector3d::equals(vector3d::cross(v1, v2),
-vector3d::cross(v2, v1)))
<< endl;
cout << "Cross distributive law: "
<< is_true(vector3d::equals(vector3d::cross(v1, v2 + v3),
vector3d::cross(v1, v2) +
vector3d::cross(v1, v3)))
<< endl;
cout << "Scalar factorization in cross: "
<< is_true(vector3d::equals(vector3d::cross(2 * v1, v2),
vector3d::cross(v1, 2 * v2)))
<< " and "
<< is_true(vector3d::equals(vector3d::cross(v1, 2 * v2),
2 * vector3d::cross(v1, v2)))
<< endl;
cout << "Vector triple product: "
<< is_true(vector3d::equals(vector3d::cross(v1, vector3d::cross(v2, v3)),
v2 * vector3d::dot(v1, v3) -
v3 * vector3d::dot(v1, v2)))
<< endl;
// Check lagrande id:
// This means:
// dot(cross(v1,v2),cross(v1,v2)) = dot(v1,v1)*dot(v2,v2) -
// dot(v1,v2)*dot(v1,v2)
cout << "Lagrange id: "
<< is_true(
vector3d::dot(vector3d::cross(v1, v2), vector3d::cross(v1, v2)) ==
(vector3d::dot(v1, v1) * vector3d::dot(v2, v2) -
(vector3d::dot(v1, v2) * vector3d::dot(v1, v2))))
<< endl;
// Projections
cout << "Project [1,1,0] in [1,0,0]: "
<< vector3d::project(vector3d(1, 1, 0), vector3d(1, 0, 0)) << endl;
cout << "Reject [1,1,0] over [1,0,0]: "
<< vector3d::reject(vector3d(1, 1, 0), vector3d(1, 0, 0)) << endl;
}

View file

@ -35,14 +35,47 @@ vector3d matrix3d::operator[](int i) {
return vector3d(*row, *(row + 1), *(row + 2));
};
const vector3d matrix3d::operator[](int i) const {
return vector3d(this->_m[i][0], this->_m[i][1], this->_m[i][2]);
};
float32 matrix3d::operator()(int row, int column) {
return this->_m[row][column];
};
float32 matrix3d::operator()(int row, int column) const {
return this->_m[row][column];
};
// Default constructor all entries are 0
matrix3d::matrix3d() { this->setAll(0); };
// Default destructor just does nothing
matrix3d::~matrix3d(){};
// Constructor based on other matrix3d instance
matrix3d::matrix3d(const matrix3d &m){};
matrix3d::matrix3d(const float32 m[3][3]) { this->setFloatArray(m); };
matrix3d::matrix3d(float32 a00, float32 a01, float32 a02, float32 a10,
float32 a11, float32 a12, float32 a20, float32 a21,
float32 a22) {
this->_m[0][0] = a00;
this->_m[0][1] = a01;
this->_m[0][2] = a02;
this->_m[1][0] = a10;
this->_m[1][1] = a11;
this->_m[1][2] = a12;
this->_m[2][0] = a20;
this->_m[2][1] = a21;
this->_m[2][2] = a22;
};
// Constructor that sets matrix entries based in a two dimentional float32 3x3
// array
matrix3d::matrix3d(float32 m[3][3]) { this->setFloatArray(m); };
// matrix3 Constructor with 3 vector3d each representing a row
matrix3d::matrix3d(const vector3d r1, const vector3d r2, const vector3d r3) {
this->_m[0][0] = r1[0];
this->_m[0][1] = r1[1];
@ -57,24 +90,124 @@ matrix3d::matrix3d(const vector3d r1, const vector3d r2, const vector3d r3) {
this->_m[2][2] = r3[2];
};
// Overload of << operator. Usefull to combine this with ostream stream
std::ostream &operator<<(std::ostream &stream, matrix3d const &m) {
stream << "matrix3d(" << std::endl;
stream << m._m[0][0] << "," << m._m[0][1] << "," << m._m[0][2] << std::endl;
stream << m._m[1][0] << "," << m._m[1][1] << "," << m._m[1][2] << std::endl;
stream << m._m[2][0] << "," << m._m[2][1] << "," << m._m[2][2] << std::endl;
stream << ")";
stream << "[" << m._m[0][0] << "," << m._m[0][1] << "," << m._m[0][2] << "]"
<< std::endl;
stream << "[" << m._m[1][0] << "," << m._m[1][1] << "," << m._m[1][2] << "]"
<< std::endl;
stream << "[" << m._m[2][0] << "," << m._m[2][1] << "," << m._m[2][2] << "]"
<< std::endl;
return stream;
};
matrix3d matrix3d::Identity() {
// Just builds an id matrix
matrix3d matrix3d::id() {
float32 id[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
return matrix3d(id);
};
matrix3d operator+(const matrix3d &left, const matrix3d &right) {
MATRIX(m_temp);
m_temp[0][0];
return NULL;
matrix3d matrix3d::trans(const matrix3d &matrix) {
return matrix3d(
matrix(0, 0), matrix(1, 0), matrix(2, 0), // First column into first row
matrix(0, 1), matrix(1, 1), matrix(2, 1), // Second column into second row
matrix(0, 2), matrix(1, 2), matrix(2, 2) // Third column into third row
);
};
} // namespace engine::math
bool matrix3d::equals(const matrix3d &first, const matrix3d &second) {
return first(0, 0) == second(0, 0) && first(0, 1) == second(0, 1) &&
first(0, 2) == second(0, 2) && first(1, 0) == second(1, 0) &&
first(1, 1) == second(1, 1) && first(1, 2) == second(1, 2) &&
first(2, 0) == second(2, 0) && first(2, 1) == second(2, 1) &&
first(2, 2) == second(2, 2);
}
// Overload of + operator. This will add 2 matrix3d instances
matrix3d operator+(const matrix3d &left, const matrix3d &right) {
MATRIX(add);
add[0][0] = left[0][0] + right[0][0];
add[0][1] = left[0][1] + right[0][1];
add[0][2] = left[0][2] + right[0][2];
add[1][0] = left[1][0] + right[1][0];
add[1][1] = left[1][1] + right[1][1];
add[1][2] = left[1][2] + right[1][2];
add[2][0] = left[2][0] + right[2][0];
add[2][1] = left[2][1] + right[2][1];
add[2][2] = left[2][2] + right[2][2];
return matrix3d(add);
};
matrix3d operator-(const matrix3d &left, const matrix3d &right) {
MATRIX(m_temp);
m_temp[0][0] = left[0][0] - right[0][0];
m_temp[0][1] = left[0][1] - right[0][1];
m_temp[0][2] = left[0][2] - right[0][2];
m_temp[1][0] = left[1][0] - right[1][0];
m_temp[1][1] = left[1][1] - right[1][1];
m_temp[1][2] = left[1][2] - right[1][2];
m_temp[2][0] = left[2][0] - right[2][0];
m_temp[2][1] = left[2][1] - right[2][1];
m_temp[2][2] = left[2][2] - right[2][2];
return matrix3d(m_temp);
};
// Multiplication of two 3d matrices
matrix3d operator*(const matrix3d &a, const matrix3d &b) {
float32 m00 = a(0, 0) * b(0, 0) + a(0, 1) * b(1, 0) +
a(0, 2) * b(2, 0); // a first row times b first column
float32 m01 = a(0, 0) * b(0, 1) + a(0, 1) * b(1, 1) +
a(0, 2) * b(2, 1); // a first row times b second column
float32 m02 = a(0, 0) * b(0, 2) + a(0, 1) * b(1, 2) +
a(0, 2) * b(2, 2); // a first row times b third column
float32 m10 = a(1, 0) * b(0, 0) + a(1, 1) * b(1, 0) +
a(1, 2) * b(2, 0); // a second row times b first column
float32 m11 = a(1, 0) * b(0, 1) + a(1, 1) * b(1, 1) +
a(1, 2) * b(2, 1); // a second row times b second column
float32 m12 = a(1, 0) * b(0, 2) + a(1, 1) * b(1, 2) +
a(1, 2) * b(2, 2); // a second row times b third column
float32 m20 = a(2, 0) * b(0, 0) + a(2, 1) * b(1, 0) +
a(2, 2) * b(2, 0); // a third row times b first column
float32 m21 = a(2, 0) * b(0, 1) + a(2, 1) * b(1, 1) +
a(2, 2) * b(2, 1); // a third column times b second column
float32 m22 = a(2, 0) * b(0, 2) + a(2, 1) * b(1, 2) +
a(2, 2) * b(2, 2); // a third column times b third column
return matrix3d(m00, m01, m02, m10, m11, m12, m20, m21, m22);
};
matrix3d operator*(const matrix3d &matrix, const float32 scalar) {
return matrix3d(
matrix(0, 0) * scalar, matrix(0, 1) * scalar, matrix(0, 2) * scalar,
matrix(1, 0) * scalar, matrix(1, 1) * scalar, matrix(1, 2) * scalar,
matrix(2, 0) * scalar, matrix(2, 1) * scalar, matrix(2, 2) * scalar);
};
matrix3d operator*(const float scalar, const matrix3d &matrix) {
return matrix * scalar;
}
vector3d operator*(const matrix3d &matrix, const vector3d &vector) {
return vector3d(matrix(0, 0) * vector[0] + matrix(0, 1) * vector[1] +
matrix(0, 2) * vector[2], // First row times vector
matrix(1, 0) * vector[0] + matrix(1, 1) * vector[1] +
matrix(1, 2) * vector[2], // Second row times vector
matrix(2, 0) * vector[0] + matrix(2, 1) * vector[1] +
matrix(2, 2) * vector[2]); // Third row times vector
};
vector3d operator*(const vector3d &vector, const matrix3d &matrix) {
return vector3d(vector[0] * matrix(0, 0) + vector[1] * matrix(1, 0) +
vector[2] * matrix(2, 0), // vector times first column
vector[0] * matrix(0, 1) + vector[1] * matrix(1, 1) +
vector[2] * matrix(2, 1), // vector times second column
vector[0] * matrix(0, 2) + vector[1] * matrix(1, 2) +
vector[2] * matrix(2, 2)); // vector times third column
}
}; // namespace engine::math

View file

@ -16,20 +16,37 @@ public:
// Default empty constructor
matrix3d();
~matrix3d();
static matrix3d Identity();
matrix3d(const float32[3][3]);
matrix3d(float32[3][3]);
matrix3d(float32 a00, float32 a01, float32 a02, float32 a10, float32 a11,
float32 a12, float32 a20, float32 a21, float32 a22);
matrix3d(const vector3d r1, const vector3d r2, const vector3d r3);
// Constructor with matrix3d object
matrix3d(const matrix3d &m);
vector3d operator[](int i);
const vector3d operator[](int i) const;
float32 operator()(int r, int c);
float32 operator()(int r, int c) const;
friend std::ostream &operator<<(std::ostream &stream,
engine::math::matrix3d const &m);
// Give us the identity matrix
static matrix3d id();
// Transpose the matrix
static matrix3d trans(const matrix3d &matrix);
// Compute the matrix determinant value
static float32 det(const matrix3d &matrix);
// Check if two matrices are equal, by checking each entry equality
static bool equals(const matrix3d &first, const matrix3d &second);
};
// Non instance operator overloading
matrix3d operator+(const matrix3d &left, const matrix3d &right);
matrix3d operator-(const matrix3d &left, const matrix3d &right);
matrix3d operator*(const matrix3d &left, const matrix3d &right);
matrix3d operator*(const matrix3d &matrix, const float32 scalar);
vector3d operator*(const matrix3d &matrix, const vector3d &vector);
vector3d operator*(const vector3d &vector, const matrix3d &matrix);
matrix3d operator*(const float32 scalar, const matrix3d &matrix);
}; // namespace engine::math

View file

@ -20,12 +20,28 @@ vector3d &vector3d::operator-=(const vector3d &other) {
return (*this);
};
vector3d vector3d::operator+(const vector3d &other) {
return vector3d(this->x + other.x, this->y + other.y, this->z + other.z);
vector3d operator+(const vector3d &left, const vector3d &right) {
return vector3d(left[0] + right[0], left[1] + right[1], left[2] + right[2]);
}
vector3d vector3d::operator-(const vector3d &other) {
return vector3d(this->x - other.x, this->y - other.y, this->z - other.z);
vector3d operator-(const vector3d &left, const vector3d &right) {
return vector3d(left[0] - right[0], left[1] - right[1], left[2] - right[2]);
}
vector3d operator-(const vector3d &vector, float32 scalar) {
return vector3d(vector[0] - scalar, vector[1] - scalar, vector[2] - scalar);
}
vector3d operator*(float32 scalar, const vector3d &vector) {
return vector3d(vector[0] * scalar, vector[1] * scalar, vector[2] * scalar);
};
vector3d operator*(const vector3d &vector, float32 scalar) {
return vector3d(vector[0] * scalar, vector[1] * scalar, vector[2] * scalar);
}
vector3d operator*(const vector3d &v1, const vector3d &v2) {
return vector3d(v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2]);
}
vector3d vector3d::operator-() {
@ -43,11 +59,36 @@ vector3d::vector3d(float32 _x, float32 _y, float32 _z) {
this->z = _z;
};
float32 vector3d::Magnitude(const vector3d &v) {
float32 vector3d::norm(const vector3d &v) {
return sqrt((v.x * v.x + v.y * v.y + v.z * v.z));
};
vector3d vector3d::Normalize(vector3d &v) { return v / vector3d::Magnitude(v); }
vector3d vector3d::normalize(vector3d &v) { return v / vector3d::norm(v); }
float32 vector3d::dot(const vector3d &one, const vector3d &other) {
return one.x * other.x + one.y * other.y + one.z * other.z;
};
// Cross product of two vectors given by
// v1_y*v2_z-v1_z*v2y,
// v1_z*v2_x-v1_x*v2_z
// v1_x*v2_y-v1_y*v2_x
vector3d vector3d::cross(const vector3d &v1, const vector3d &v2) {
return vector3d(v1.y * v2.z - v1.z * v2.y, v1.z * v2.x - v1.x * v2.z,
v1.x * v2.y - v1.y * v2.x);
};
vector3d vector3d::project(const vector3d &v1, const vector3d &v2) {
return v2 * (vector3d::dot(v1, v2) / vector3d::dot(v2, v2));
}
vector3d vector3d::reject(const vector3d &v1, const vector3d &v2) {
return v1 - (v2 * (vector3d::dot(v1, v2) / vector3d::dot(v2, v2)));
}
bool vector3d::equals(const vector3d &v1, const vector3d &v2) {
return v1.x == v2.x && v1.y == v2.y && v1.y == v2.y;
};
float32 &vector3d::operator[](int i) { return (&this->x)[i]; };
@ -57,6 +98,6 @@ const float32 &engine::math::vector3d::operator[](int i) const {
std::ostream &operator<<(std::ostream &stream,
engine::math::vector3d const &v) {
return stream << "vector3d(" << v[0] << "," << v[1] << "," << v[2] << ")";
return stream << "[" << v.x << "," << v.y << "," << v.z << "]";
};
} // namespace engine::math

View file

@ -37,13 +37,31 @@ public:
vector3d &operator+=(const vector3d &other);
vector3d &operator-=(const vector3d &other);
vector3d operator+(const vector3d &other);
vector3d operator-(const vector3d &other);
vector3d operator/(const float32 scalar);
vector3d operator-();
static float32 Magnitude(const vector3d &v);
static vector3d Normalize(vector3d &v);
// Compute the magnitude of the vector
static float32 norm(const vector3d &v);
// Compute the normalized vector
static vector3d normalize(vector3d &v);
// Compute the dot product
static float32 dot(const vector3d &one, const vector3d &other);
// Compute the vector3d cross product of two vectors
static vector3d cross(const vector3d &v1, const vector3d &v2);
// Check if two vectors are equal
static bool equals(const vector3d &v1, const vector3d &v2);
// Compute projection of a vector
static vector3d project(const vector3d &v1, const vector3d &v2);
// Compute rejection of a vector
static vector3d reject(const vector3d &v1, const vector3d &v2);
~vector3d();
};
// Non instance operator overloading
vector3d operator+(const vector3d &left, const vector3d &right);
vector3d operator-(const vector3d &left, const vector3d &right);
vector3d operator-(const vector3d &vector, float32 scalar);
vector3d operator*(float32 scalar, const vector3d &vector);
vector3d operator*(const vector3d &vector, float32 scalar);
vector3d operator*(const vector3d &v1, const vector3d &v2);
}; // namespace engine::math