Mat3.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #ifndef Mat3_H
  2. #define Mat3_H
  3. #include "Vec2.h"
  4. namespace Framework
  5. {
  6. template<typename T>
  7. //! Eine 3x3 Matrix
  8. class Mat3
  9. {
  10. public:
  11. T elements[3][3]; //! Die Elemente der Matrix
  12. //! Kopiert die Elemente einer anderen Matrix in diese
  13. //! \param r Die andere Matrix
  14. Mat3& operator=(const Mat3& r)
  15. {
  16. memcpy(elements, r.elements, sizeof(elements));
  17. return *this;
  18. }
  19. //! Multipliziert alle Werte mit einem Skalar und speichert das Ergebnis
  20. //! in dieser \param r Der Skalar
  21. Mat3& operator*=(const T r)
  22. {
  23. for (T& e : elements)
  24. e *= r;
  25. return *this;
  26. }
  27. //! Multipliziert die Matrix mit einer anderen und speichert das
  28. //! Ergebnis in dieser \param r Die andere Matrix
  29. Mat3& operator*=(const Mat3& r)
  30. {
  31. return *this = *this * r;
  32. }
  33. //! Multipliziert alle Werte mit einem Skalar ohne diese zu verändern
  34. //! \param r Der Skalar
  35. Mat3 operator*(const T r) const
  36. {
  37. Mat3 result = *this;
  38. return result *= r;
  39. }
  40. //! Multipliziert die Matrix mit einer anderen ohne diese zu verändern
  41. //! \param r Die andere Matrix
  42. Mat3 operator*(const Mat3& r) const
  43. {
  44. Mat3 result;
  45. for (int j = 0; j < 3; j++)
  46. {
  47. for (int k = 0; k < 3; k++)
  48. {
  49. T sum = 0;
  50. for (int i = 0; i < 3; i++)
  51. sum += elements[j][i] * r.elements[i][k];
  52. result.elements[j][k] = sum;
  53. }
  54. }
  55. return result;
  56. }
  57. //! Multipliziert die Matrix mit einem Vektor ohne diese zu verändern
  58. //! \param r Der Vektor
  59. Vec2<T> operator*(const Vec2<T> r) const
  60. {
  61. Vec2<T> result;
  62. result.x
  63. = elements[0][0] * r.x + elements[0][1] * r.y + elements[0][2];
  64. result.y
  65. = elements[1][0] * r.x + elements[1][1] * r.y + elements[1][2];
  66. return result;
  67. }
  68. //! Erzeugt eine Matrix, die verwendet wird, um einen Vektor zu drehen,
  69. //! wenn sie mit ihm multipliziert wird \param radian Der Winkel im
  70. //! Bogenmas, um dem der Vektor gedreht werden soll
  71. static Mat3 rotation(T radian)
  72. {
  73. const T cosTheta = (T)lowPrecisionCos(radian);
  74. const T sinTheta = (T)lowPrecisionSin(radian);
  75. Mat3 r = {cosTheta, -sinTheta, 0, sinTheta, cosTheta, 0, 0, 0, 1};
  76. return r;
  77. }
  78. //! Erzeugt eine Matrix, die einen Vektor skalliert. wenn sie mit ihm
  79. //! multipliziert wird \param faktor Der Faktor, um den Skalliert werden
  80. //! soll
  81. static Mat3 scaling(T faktor)
  82. {
  83. Mat3 s = {faktor, 0, 0, 0, faktor, 0, 0, 0, 1};
  84. return s;
  85. }
  86. //! Erzeugt eine Matrix, die einen Vektor verschiebt, wenn sie mit ihm
  87. //! multipliziert wird \param offset Die x und y Werte, die zu dem
  88. //! Vektor dazu addiert werden sollen
  89. static Mat3 translation(const Vec2<T> offset)
  90. {
  91. Mat3 t = {1, 0, offset.x, 0, 1, offset.y, 0, 0, 1};
  92. return t;
  93. }
  94. //! Erzeugt eine MAtrix, die mit allem multiplizert werden kann, ohne es
  95. //! zu verändern
  96. static Mat3 identity()
  97. {
  98. Mat3 i = {1, 0, 0, 0, 1, 0, 0, 0, 1};
  99. return i;
  100. }
  101. };
  102. } // namespace Framework
  103. #endif