VecN.h 4.4 KB

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