Ebene3D.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #pragma once
  2. #include "Vec3.h"
  3. namespace Framework
  4. {
  5. template<typename T>
  6. //! Speichert eine 3D Ebene in Koordinaten Form (x*?+y*?+z*?-w=0)
  7. class Ebene3D
  8. {
  9. public:
  10. T x; //! Die X Komponente des Normalen Vektors der Ebene
  11. T y; //! Die Y Komponente des Normalen Vektors der Ebene
  12. T z; //! Die Z Komponente des Normalen Vektors der Ebene
  13. T w; //! Der Wert, den das Skalarprodukt eines Vektors mit dem Normalen
  14. //! Vektor haben muss um in der Ebene zu liegen
  15. //! Konstruktor
  16. inline Ebene3D()
  17. : x((T)0),
  18. y((T)0),
  19. z((T)0),
  20. w((T)0)
  21. {}
  22. //! Knstruktor
  23. //! \param x Die X Komponente des Normalen Vektors der Ebene
  24. //! \param y Die Y Komponente des Normalen Vektors der Ebene
  25. //! \param z Die Z Komponente des Normalen Vektors der Ebene
  26. //! \param w Der Wert, den das Skalarprodukt eines Vektors mit dem
  27. //! Normalen Vektor haben muss um in der Ebene zu liegen
  28. inline Ebene3D(T x, T y, T z, T w)
  29. : x(x),
  30. y(y),
  31. z(z),
  32. w(w)
  33. {}
  34. //! Knstruktor
  35. //! \param vect Die Ebene, deren Werte kopiert werden sollen
  36. inline Ebene3D(const Ebene3D& vect)
  37. : Ebene3D(vect.x, vect.y, vect.z, vect.w)
  38. {}
  39. //! Bringt den Normalen Vektor der Ebene auf die Länge 1
  40. inline Ebene3D& normalize()
  41. {
  42. const T length = len();
  43. x /= length;
  44. y /= length;
  45. z /= length;
  46. w /= length;
  47. return *this;
  48. }
  49. //! Tauscht die Werte zweier Ebenen
  50. //! \param vect die zweite Ebene
  51. inline Ebene3D& Swap(Ebene3D& vect)
  52. {
  53. const Ebene3D tmp = vect;
  54. vect = *this;
  55. *this = tmp;
  56. return *this;
  57. }
  58. //! Kopiert die Werte einer anderen Ebene
  59. //! \param r Die andere Ebene
  60. inline Ebene3D operator=(const Ebene3D& r)
  61. {
  62. x = r.x;
  63. y = r.y;
  64. z = r.z;
  65. w = r.w;
  66. return *this;
  67. }
  68. //! Addiert eine andere Ebene dazu
  69. //! \param r Die andere Ebene
  70. inline Ebene3D operator+=(const Ebene3D& r)
  71. {
  72. x += r.x;
  73. y += r.y;
  74. z += r.z;
  75. w += r.w;
  76. return *this;
  77. }
  78. //! Subtrahiert eine andere Ebene
  79. //! \param r Die andere Ebene
  80. inline Ebene3D operator-=(const Ebene3D& r)
  81. {
  82. x -= r.x;
  83. y -= r.y;
  84. z -= r.z;
  85. w -= r.w;
  86. return *this;
  87. }
  88. //! Multipliziert die Ebene mit einem Faktor
  89. //! \param r Der Faktor
  90. inline Ebene3D operator*=(const T& r)
  91. {
  92. x *= r;
  93. y *= r;
  94. z *= r;
  95. w *= r;
  96. return *this;
  97. }
  98. //! Teilt die Ebene durch einen Faktor
  99. //! \param r Der Faktor
  100. inline Ebene3D operator/=(const T& r)
  101. {
  102. x /= r;
  103. y /= r;
  104. z /= r;
  105. w /= r;
  106. return *this;
  107. }
  108. template<typename T2>
  109. //! Konvertiert die Ebene in einen anderen Typ
  110. inline operator Ebene3D<T2>() const
  111. {
  112. return {(T2)x, (T2)y, (T2)z, (T2)w};
  113. }
  114. //! Errehnet das Quadrat der Länge des Normalen Vektors der Ebene
  115. inline T lenSq() const
  116. {
  117. return x * x + y * y + z * z;
  118. }
  119. //! Errechnet die Länge des Normalen Vektors
  120. inline T len() const
  121. {
  122. return sqrt(lenSq());
  123. }
  124. //! Berechnet die Entfernung der Ebene zu einem Vektor
  125. //! \param r Der Vektor
  126. inline T operator*(const Vec3<T>& r) const
  127. {
  128. return x * r.x + y * r.y + z * r.z + w;
  129. }
  130. //! Addiert zwei Ebenen
  131. //! \param r Die andere Ebene
  132. inline Ebene3D operator+(const Ebene3D& r) const
  133. {
  134. return Vec4(*this) += r;
  135. }
  136. //! Subtrahiert zwei Ebenen
  137. //! \param r Die andere Ebene
  138. inline Ebene3D operator-(const Ebene3D& r) const
  139. {
  140. return Ebene3D(*this) -= r;
  141. }
  142. //! Multiliziert die Ebene mit einem Faktor
  143. //! r: Der Faktor
  144. inline Ebene3D operator*(const T& r) const
  145. {
  146. return Ebene3D(*this) *= r;
  147. }
  148. //! Dividiert die Ebene durch einen Faktor
  149. //! \param r Der Faktor
  150. inline Ebene3D operator/(const T& r) const
  151. {
  152. return Ebene3D(*this) /= r;
  153. }
  154. //! Überprüft zwei Ebenen auf Gleichheit
  155. //! \param r Die andere Ebene
  156. inline bool operator==(const Ebene3D& r) const
  157. {
  158. return x == r.x && y == r.y && z == r.z && w == r.w;
  159. }
  160. //! Überprüft zwei Ebenen auf Ungleichheit
  161. //! \param r Die andere Ebene
  162. inline bool operator!=(const Ebene3D& r) const
  163. {
  164. return !(*this == r);
  165. }
  166. inline Vec3<T> normal() const
  167. {
  168. return {x, y, z};
  169. }
  170. };
  171. } // namespace Framework