From 27b51e8c35e62183583a80a8689591fdbaf031f9 Mon Sep 17 00:00:00 2001 From: xAlpharax <42233094+xAlpharax@users.noreply.github.com> Date: Sat, 2 Sep 2023 15:41:23 +0300 Subject: Initial migration of the project. It does work but would require some documentation. Changes to be committed: new file: LorenzAttractor.cpp new file: LorenzAttractor.h modified: README.md new file: main.cpp new file: run.sh new file: vectormath.h --- vectormath.h | 310 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 310 insertions(+) create mode 100644 vectormath.h (limited to 'vectormath.h') diff --git a/vectormath.h b/vectormath.h new file mode 100644 index 0000000..874502f --- /dev/null +++ b/vectormath.h @@ -0,0 +1,310 @@ +#pragma once +#include +#include +#include +#include +#include + +///////////////////// +// MATRIX CLASS // +///////////////////// + +template +class Matrix3 +{ +private: + T **m_data; +public: + Matrix3() + { + m_data = new T*[3]; + for (int i = 0; i < 3; i++) + m_data[i] = new T[3]; + } + + Matrix3(const std::initializer_list> &list_ext) + { + assert(list_ext.size() == 3); + + m_data = new T*[3]; + for (int i = 0; i < 3; i++) + m_data[i] = new T[3]; + + int i = 0, j = 0; + for (auto &list_int : list_ext) + { + assert(list_int.size() == 3); + j = 0; + for (auto &element : list_int) + { + m_data[i][j] = element; + j++; + } + i++; + } + } + + void erase() + { + for (int i = 0; i < 3; i++) + delete[] m_data[i]; + delete[] m_data; + + m_data = nullptr; + } + + const T* operator[](const int r) const + { + assert(r >= 0 && r < 3); + return m_data[r]; + } + + T* operator[](const int r) + { + assert(r >= 0 && r < 3); + return m_data[r]; + } + + Matrix3& operator=(const std::initializer_list> list_ext) + { + assert(list_ext.size() == 3); + + this->erase(); + + m_data = new T*[3]; + for (int i = 0; i < 3; i++) + m_data[i] = new T[3]; + + int i = 0, j = 0; + for (auto &list_int : list_ext) + { + assert(list_int.size() == 3); + j = 0; + for (auto &element : list_int) + { + m_data[i][j] = element; + j++; + } + i++; + } + + return (*this); + } + + Matrix3& operator=(const Matrix3 &m) + { + this->erase(); + + m_data = new T*[3]; + for (int i = 0; i < 3; i++) + m_data[i] = new T[3]; + + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + m_data[i][j] = m[i][j]; + + return (*this); + } + + ~Matrix3() + { + delete[] m_data[0]; + delete[] m_data[1]; + delete[] m_data[2]; + + delete[] m_data; + } +}; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +template +std::ostream& operator<<(std::ostream &out, Matrix3 &m) +{ + for (int r = 0; r < 3; r++) + { + for (int c = 0; c < 3; c++) + out << m[r][c] << " "; + out << "\n"; + } + + return out; +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +template +bool operator==(Matrix3 m1, Matrix3 m2) +{ + int s = 0; + for (int r = 0; r < m1.getNumRows(); r++) + for (int c = 0; c < m1.getNumCols(); c++) + s += (m1[r][c] == m2[r][c]); + + if (s == m1.getNumRows() * m1.getNumCols()) + return true; + else return false; +} + +template +bool operator!=(Matrix3 m1, Matrix3 m2) +{ + int s = 0; + for (int r = 0; r < m1.getNumRows(); r++) + for (int c = 0; c < m1.getNumCols(); c++) + s += (m1[r][c] == m2[r][c]); + + if (s == m1.getNumRows() * m1.getNumCols()) + return false; + else return true; +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +template +Matrix3 operator+(const Matrix3 &left, const Matrix3 &right) +{ + return { {left[0][0] + right[0][0], left[0][1] + right[0][1], left[0][2] + right[0][2]}, + {left[1][0] + right[1][0], left[1][1] + right[1][1], left[1][2] + right[1][2]}, + {left[2][0] + right[2][0], left[2][1] + right[2][1], left[2][2] + right[2][2]} }; +} + +template +Matrix3& operator+=(Matrix3 &left, const Matrix3 &right) +{ + for (int r = 0; r < 3; r++) + for (int c = 0; c < 3; c++) + left[r][c] += right[r][c]; + + return left; +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +template +Matrix3 operator-(const Matrix3 &left, const Matrix3 &right) +{ + return { {left[0][0] - right[0][0], left[0][1] - right[0][1], left[0][2] - right[0][2]}, + {left[1][0] - right[1][0], left[1][1] - right[1][1], left[1][2] - right[1][2]}, + {left[2][0] - right[2][0], left[2][1] - right[2][1], left[2][2] - right[2][2]} }; +} + +template +Matrix3& operator-=(Matrix3 &left, const Matrix3 &right) +{ + for (int r = 0; r < 3; r++) + for (int c = 0; c < 3; c++) + left[r][c] -= right[r][c]; + + return left; +} + +template +Matrix3& operator-(Matrix3 &left) +{ + for (int r = 0; r < 3; r++) + for (int c = 0; c < 3; c++) + left[r][c] = -left[r][c]; + + return left; +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +template +Matrix3& operator*=(Matrix3 &left, const U &right) +{ + for (int r = 0; r < 3; r++) + for (int c = 0; c < 3; c++) + left[r][c] *= right; + return left; +} + +template +Matrix3 operator*(const Matrix3 &left, const U &right) +{ + return { {left[0][0] * right, left[0][1] * right, left[0][2] * right}, + {left[1][0] * right, left[1][1] * right, left[1][2] * right}, + {left[2][0] * right, left[2][1] * right, left[2][2] * right} }; +} + +template +Matrix3 operator*(const U &left, const Matrix3 &right) +{ + return { {left * right[0][0], left * right[0][1], left * right[0][2]}, + {left * right[1][0], left * right[1][1], left * right[1][2]}, + {left * right[2][0], left * right[2][1], left * right[2][2]} }; +} + +template +Matrix3 operator*(Matrix3 &left, Matrix3 &right) +{ + T _00 = left[0][0] * right[0][0] + left[0][1] * right[1][0] + left[0][2] * right[2][0]; + T _01 = left[0][0] * right[0][1] + left[0][1] * right[1][1] + left[0][2] * right[2][1]; + T _02 = left[0][0] * right[0][2] + left[0][1] * right[1][2] + left[0][2] * right[2][2]; + + T _10 = left[1][0] * right[0][0] + left[1][1] * right[1][0] + left[1][2] * right[2][0]; + T _11 = left[1][0] * right[0][1] + left[1][1] * right[1][1] + left[1][2] * right[2][1]; + T _12 = left[1][0] * right[0][2] + left[1][1] * right[1][2] + left[1][2] * right[2][2]; + + T _20 = left[2][0] * right[0][0] + left[2][1] * right[1][0] + left[2][2] * right[2][0]; + T _21 = left[2][0] * right[0][1] + left[2][1] * right[1][1] + left[2][2] * right[2][1]; + T _22 = left[2][0] * right[0][2] + left[2][1] * right[1][2] + left[2][2] * right[2][2]; + + return { {_00,_01,_02},{_10,_11,_12},{_20,_21,_22} }; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +template +Matrix3& operator/=(Matrix3 &left, U right) +{ + for (int r = 0; r < 3; r++) + for (int c = 0; c < 3; c++) + left[r][c] /= right; + return left; +} + +template +Matrix3 operator/(Matrix3 left, U right) +{ + return { {left[0][0] / right, left[0][1] / right, left[0][2] / right}, + {left[1][0] / right, left[1][1] / right, left[1][2] / right}, + {left[2][0] / right, left[2][1] / right, left[2][2] / right} }; +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +///////////////////// +// 2D VECTOR MATHS // +///////////////////// + +template +float Magnitude(const V2 &v) +{ + return sqrt(static_cast(v.x * v.x + v.y * v.y)); +} + +template +V2 UnitVector(const V2 &v) +{ + return v / Magnitude(v); +} + +template +bool operator>(const V2 &v1,const V2 &v2) +{ + if (Magnitude(v1) > Magnitude(v2)) + return true; + else return false; +} + +template +bool operator<(V2 &v1, V2 &v2) +{ + if (Magnitude(v1) > Magnitude(v2)) + return true; + else return false; +} + +///////////////////// +// 3D VECTOR MATHS // +///////////////////// + +template +sf::Vector3 operator*(const Matrix3 &m, const sf::Vector3 &v) +{ + return sf::Vector3( + m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z, + m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z, + m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + ); +} -- cgit v1.2.3