From e4e3bcf5589c2772056a0f0514d92d1215cf2349 Mon Sep 17 00:00:00 2001 From: Tomila Bakeeva Date: Sun, 16 Nov 2025 18:15:27 +0100 Subject: [PATCH] Entwickler: gamematrix.cpp implementiert (matmul, translate, rot3D) --- gamecube.h => includes/gamecube.h | 0 gamematrix.h => includes/gamematrix.h | 0 gamecube.cpp => src/gamecube.cpp | 0 src/gamematrix.cpp | 97 +++++++++++++++++++++++++++ main.cpp => src/main.cpp | 0 5 files changed, 97 insertions(+) rename gamecube.h => includes/gamecube.h (100%) rename gamematrix.h => includes/gamematrix.h (100%) rename gamecube.cpp => src/gamecube.cpp (100%) create mode 100644 src/gamematrix.cpp rename main.cpp => src/main.cpp (100%) diff --git a/gamecube.h b/includes/gamecube.h similarity index 100% rename from gamecube.h rename to includes/gamecube.h diff --git a/gamematrix.h b/includes/gamematrix.h similarity index 100% rename from gamematrix.h rename to includes/gamematrix.h diff --git a/gamecube.cpp b/src/gamecube.cpp similarity index 100% rename from gamecube.cpp rename to src/gamecube.cpp diff --git a/src/gamematrix.cpp b/src/gamematrix.cpp new file mode 100644 index 0000000..3a20980 --- /dev/null +++ b/src/gamematrix.cpp @@ -0,0 +1,97 @@ +// +// Created by bakee on 03.11.2025. +// +#include "gamematrix.h" +#include + +namespace Matrix3D +{ + Mat4 gameMatrix::identity() + { + return {{ + {1.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 1.0} + }}; + } + + Mat4 gameMatrix::matmul(const Mat4& A, const Mat4& B) + { + const int N = 4; + Mat4 result = {}; + for (int i = 0; i < N; ++i) + { + for (int j = 0; j < N; ++j) + { + for (int k = 0; k < N; ++k) + { + result[i][j] += A[i][k] * B[k][j]; + } + } + } + return result; + } + + Mat4 gameMatrix::translate(const Vec3& pos) + { + Mat4 result = identity(); + + result[0][3] = pos[0]; // x + result[1][3] = pos[1]; // y + result[2][3] = pos[2]; // z + + return result; + } + + Mat4 gameMatrix::rot3D(double angle_deg, char axis) + { + const double angle_rad = angle_deg * M_PI / 180.0; + + Mat4 result = identity(); + + const double c = std::cos(angle_rad); + const double s = std::sin(angle_rad); + + switch (axis) + { + case 'x': + result[1][1] = c; result[1][2] = -s; + result[2][1] = s; result[2][2] = c; + break; + case 'y': + result[0][0] = c; result[0][2] = s; + result[2][0] = -s; result[2][2] = c; + break; + case 'z': + result[0][0] = c; result[0][1] = -s; + result[1][0] = s; result[1][1] = c; + break; + default: + break; + } + return result; + } + + Mat4 operator*(const Mat4& A, const Mat4& B) + { + return gameMatrix::matmul(A, B); + } + + Vec3 operator*(const Mat4& m, const Vec3& v) + { + Vec4 v_hom = {v[0], v[1], v[2], 1.0}; + Vec4 res_hom = {}; + + for (int i = 0; i < 4; ++i) + { + for (int j = 0; j < 4; ++j) + { + res_hom[i] += m[i][j] * v_hom[j]; + } + } + + return {res_hom[0], res_hom[1], res_hom[2]}; + } + +} \ No newline at end of file diff --git a/main.cpp b/src/main.cpp similarity index 100% rename from main.cpp rename to src/main.cpp