Mat3.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. // 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 in dieser
  20. // 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 Ergebnis in dieser
  28. // 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. // 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. // 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. // r: Der Vektor
  59. Vec2< T > operator*( const Vec2< T > r ) const
  60. {
  61. Vec2< T > result;
  62. result.x = elements[ 0 ][ 0 ] * r.x + elements[ 0 ][ 1 ] * r.y + elements[ 0 ][ 2 ];
  63. result.y = elements[ 1 ][ 0 ] * r.x + elements[ 1 ][ 1 ] * r.y + elements[ 1 ][ 2 ];
  64. return result;
  65. }
  66. // Erzeugt eine Matrix, die verwendet wird, um einen Vektor zu drehen, wenn sie mit ihm multipliziert wird
  67. // radian: Der Winkel im Bogenmas, um dem der Vektor gedreht werden soll
  68. static Mat3 rotation( T radian )
  69. {
  70. const T cosTheta = (T)lowPrecisionCos( radian );
  71. const T sinTheta = (T)lowPrecisionSin( radian );
  72. Mat3 r = { cosTheta, -sinTheta, 0, sinTheta, cosTheta, 0, 0, 0, 1 };
  73. return r;
  74. }
  75. // Erzeugt eine Matrix, die einen Vektor skalliert. wenn sie mit ihm multipliziert wird
  76. // faktor: Der Faktor, um den Skalliert werden soll
  77. static Mat3 scaling( T faktor )
  78. {
  79. Mat3 s = { faktor, 0, 0, 0, faktor, 0, 0, 0, 1 };
  80. return s;
  81. }
  82. // Erzeugt eine Matrix, die einen Vektor verschiebt, wenn sie mit ihm multipliziert wird
  83. // offset: Die x und y Werte, die zu dem Vektor dazu addiert werden sollen
  84. static Mat3 translation( const Vec2< T > offset )
  85. {
  86. Mat3 t = { 1, 0, offset.x, 0, 1, offset.y, 0, 0, 1 };
  87. return t;
  88. }
  89. // Erzeugt eine MAtrix, die mit allem multiplizert werden kann, ohne es zu verändern
  90. static Mat3 identity()
  91. {
  92. Mat3 i = { 1, 0, 0, 0, 1, 0, 0, 0, 1 };
  93. return i;
  94. }
  95. };
  96. }
  97. #endif