Ebene3D.h 3.9 KB

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