VecN.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #pragma once
  2. #include "FrameworkMath.h"
  3. namespace Framework
  4. {
  5. template<typename T, int N>
  6. //! Ein 3D Vektor
  7. class VecN
  8. {
  9. private:
  10. T v[N];
  11. public:
  12. //! Konstruktor
  13. inline VecN() {}
  14. //! Konstruktor
  15. //! \param v die werte des Vectors
  16. inline VecN(const T v[N])
  17. {
  18. memcpy(this->v, v, sizeof(T) * N);
  19. }
  20. inline VecN(std::initializer_list<T> l)
  21. {
  22. assert(l.size() == N);
  23. int i = 0;
  24. for (auto v : l)
  25. {
  26. this->v[i] = v;
  27. i++;
  28. }
  29. }
  30. //! Konstruktor
  31. //! \param vect Ein Vektor, dessen Werte kopiert werden sollen
  32. inline VecN(const VecN& vect)
  33. : VecN(vect.v)
  34. {}
  35. //! Skalliert den Vektor, so dass er die Länge 1 hat
  36. inline VecN& normalize()
  37. {
  38. const T length = getLength();
  39. for (int i = 0; i < N; i++)
  40. v[i] /= length;
  41. return *this;
  42. }
  43. //! Vertaucht die Werte des Vektors mit denen eines anderen Vektor
  44. //! \param vect Der andere Vektor
  45. inline VecN& swap(VecN& vect)
  46. {
  47. const VecN tmp = vect;
  48. vect = *this;
  49. *this = tmp;
  50. return *this;
  51. }
  52. //! Berechnet einen winkel zwischen diesem und einem anderen Vektor
  53. inline float angle(VecN vect)
  54. {
  55. return lowPrecisionACos(
  56. (float)(*this * vect)
  57. / ((float)getLength() * (float)vect.getLength()));
  58. }
  59. //! Kopiert die Werte eines anderen Vektors
  60. //! \param r Der andere Vektor
  61. inline VecN operator=(const VecN& r)
  62. {
  63. memcpy(v, r.v, sizeof(T) * N);
  64. return *this;
  65. }
  66. //! Addiert einen anderen Vektor zu diesem Hinzu
  67. //! \param r Der andere Vektor
  68. inline VecN operator+=(const VecN& r)
  69. {
  70. for (int i = 0; i < N; i++)
  71. v[i] += r.v[i];
  72. return *this;
  73. }
  74. //! Zieht einen anderen Vektor von diesem ab
  75. //! \param r Der andere Vektor
  76. inline VecN operator-=(const VecN& r)
  77. {
  78. for (int i = 0; i < N; i++)
  79. v[i] -= r.v[i];
  80. return *this;
  81. }
  82. //! Skalliert diesen Vektor
  83. //! \param r Der Faktor
  84. inline VecN operator*=(const T& r)
  85. {
  86. for (int i = 0; i < N; i++)
  87. v[i] *= r;
  88. return *this;
  89. }
  90. //! Skalliert diesen Vektor mit 1/Faktor
  91. //! \param r Der Faktor
  92. inline VecN operator/=(const T& r)
  93. {
  94. for (int i = 0; i < N; i++)
  95. v[i] /= r;
  96. return *this;
  97. }
  98. //! Errechnet das Quadrat des Abstands zwischen zewi Vektoren
  99. //! \param p Der andere Vektor
  100. inline T abstandSq(const VecN& p) const
  101. {
  102. T sum = (T)0;
  103. for (int i = 0; i < N; i++)
  104. sum += (v[i] - p.v[i]) * (v[i] - p.v[i]);
  105. return sum;
  106. }
  107. //! Errechnet den Abstand zwischen zwei Vektoren
  108. //! \param p Der andere Vektor
  109. inline T abstand(const VecN& p) const
  110. {
  111. return sqrt(abstandSq(p));
  112. }
  113. //! Gibt einen neuen Vektor zurück, der die negation von diesem ist
  114. inline VecN operator-() const
  115. {
  116. T r[N];
  117. for (int i = 0; i < N; i++)
  118. r[i] = -v[i];
  119. return {r};
  120. }
  121. template<typename T2>
  122. //! Konvertiert den Typ des Vektors in einen anderen
  123. inline operator VecN<T2, N>() const
  124. {
  125. T2 r[N];
  126. for (int i = 0; i < N; i++)
  127. r[i] = (T2)v[i];
  128. return {r};
  129. }
  130. //! Errechnet das Quadrat der Länge des Vektors
  131. inline T getLengthSq() const
  132. {
  133. return *this * *this;
  134. }
  135. //! Errechnet due Länge des Vektors
  136. inline T getLength() const
  137. {
  138. return (T)sqrt(getLengthSq());
  139. }
  140. //! Bildet das Skalarprodukt zwischen zwei Vektoren
  141. //! \param r Der andere Vektor
  142. inline T operator*(const VecN& r) const
  143. {
  144. T sum = (T)0;
  145. for (int i = 0; i < N; i++)
  146. sum += v[i] * r.v[i];
  147. return sum;
  148. }
  149. //! Errechnet die Summe zweier Vektoren
  150. //! \param r Der andere Vektor
  151. inline VecN operator+(const VecN& r) const
  152. {
  153. return VecN(*this) += r;
  154. }
  155. //! Zieht zwei Vektoren von einander ab
  156. //! \param r Der andere Vektor
  157. inline VecN operator-(const VecN& r) const
  158. {
  159. return VecN(*this) -= r;
  160. }
  161. //! Skalliert den Vektor ohne ihn zu verändern
  162. //! \param r Der Faktor
  163. inline VecN operator*(const T& r) const
  164. {
  165. return VecN(*this) *= r;
  166. }
  167. //! Skalliert den Vektor mit 1/Faktor ohne ihn zu Verändern
  168. //! \param r Der Faktor
  169. inline VecN operator/(const T& r) const
  170. {
  171. return VecN(*this) /= r;
  172. }
  173. //! Überprüft zwei Vektoren auf Gleichheit
  174. //! \param r Der andere Vektor
  175. inline bool operator==(const VecN& r) const
  176. {
  177. for (int i = 0; i < N; i++)
  178. {
  179. if (v[i] != r.v[i]) return 0;
  180. }
  181. return 1;
  182. }
  183. //! Überprüft zwei Vektoren auf Ungleichheit
  184. //! \param r Der andere Vektor
  185. inline bool operator!=(const VecN& r) const
  186. {
  187. return !(*this == r);
  188. }
  189. inline T operator[](int i) const
  190. {
  191. return v[i];
  192. }
  193. };
  194. } // namespace Framework