Ebene3D.h 5.0 KB

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