123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- #pragma once
- #include "Vec3.h"
- namespace Framework
- {
- template<typename T>
- //! Speichert eine 3D Ebene in Koordinaten Form (x*?+y*?+z*?-w=0)
- class Ebene3D
- {
- public:
- T x; //! Die X Komponente des Normalen Vektors der Ebene
- T y; //! Die Y Komponente des Normalen Vektors der Ebene
- T z; //! Die Z Komponente des Normalen Vektors der Ebene
- T w; //! Der Wert, den das Skalarprodukt eines Vektors mit dem Normalen
- //! Vektor haben muss um in der Ebene zu liegen
- //! Konstruktor
- inline Ebene3D()
- : x((T)0),
- y((T)0),
- z((T)0),
- w((T)0)
- {}
- //! Knstruktor
- //! \param x Die X Komponente des Normalen Vektors der Ebene
- //! \param y Die Y Komponente des Normalen Vektors der Ebene
- //! \param z Die Z Komponente des Normalen Vektors der Ebene
- //! \param w Der Wert, den das Skalarprodukt eines Vektors mit dem
- //! Normalen Vektor haben muss um in der Ebene zu liegen
- inline Ebene3D(T x, T y, T z, T w)
- : x(x),
- y(y),
- z(z),
- w(w)
- {}
- //! Knstruktor
- //! \param vect Die Ebene, deren Werte kopiert werden sollen
- inline Ebene3D(const Ebene3D& vect)
- : Ebene3D(vect.x, vect.y, vect.z, vect.w)
- {}
- //! Bringt den Normalen Vektor der Ebene auf die Länge 1
- inline Ebene3D& normalize()
- {
- const T length = len();
- x /= length;
- y /= length;
- z /= length;
- w /= length;
- return *this;
- }
- //! Tauscht die Werte zweier Ebenen
- //! \param vect die zweite Ebene
- inline Ebene3D& Swap(Ebene3D& vect)
- {
- const Ebene3D tmp = vect;
- vect = *this;
- *this = tmp;
- return *this;
- }
- //! Kopiert die Werte einer anderen Ebene
- //! \param r Die andere Ebene
- inline Ebene3D operator=(const Ebene3D& r)
- {
- x = r.x;
- y = r.y;
- z = r.z;
- w = r.w;
- return *this;
- }
- //! Addiert eine andere Ebene dazu
- //! \param r Die andere Ebene
- inline Ebene3D operator+=(const Ebene3D& r)
- {
- x += r.x;
- y += r.y;
- z += r.z;
- w += r.w;
- return *this;
- }
- //! Subtrahiert eine andere Ebene
- //! \param r Die andere Ebene
- inline Ebene3D operator-=(const Ebene3D& r)
- {
- x -= r.x;
- y -= r.y;
- z -= r.z;
- w -= r.w;
- return *this;
- }
- //! Multipliziert die Ebene mit einem Faktor
- //! \param r Der Faktor
- inline Ebene3D operator*=(const T& r)
- {
- x *= r;
- y *= r;
- z *= r;
- w *= r;
- return *this;
- }
- //! Teilt die Ebene durch einen Faktor
- //! \param r Der Faktor
- inline Ebene3D operator/=(const T& r)
- {
- x /= r;
- y /= r;
- z /= r;
- w /= r;
- return *this;
- }
- template<typename T2>
- //! Konvertiert die Ebene in einen anderen Typ
- inline operator Ebene3D<T2>() const
- {
- return {(T2)x, (T2)y, (T2)z, (T2)w};
- }
- //! Errehnet das Quadrat der Länge des Normalen Vektors der Ebene
- inline T lenSq() const
- {
- return x * x + y * y + z * z;
- }
- //! Errechnet die Länge des Normalen Vektors
- inline T len() const
- {
- return sqrt(lenSq());
- }
- //! Berechnet die Entfernung der Ebene zu einem Vektor
- //! \param r Der Vektor
- inline T operator*(const Vec3<T>& r) const
- {
- return x * r.x + y * r.y + z * r.z + w;
- }
- //! Addiert zwei Ebenen
- //! \param r Die andere Ebene
- inline Ebene3D operator+(const Ebene3D& r) const
- {
- return Vec4(*this) += r;
- }
- //! Subtrahiert zwei Ebenen
- //! \param r Die andere Ebene
- inline Ebene3D operator-(const Ebene3D& r) const
- {
- return Ebene3D(*this) -= r;
- }
- //! Multiliziert die Ebene mit einem Faktor
- //! r: Der Faktor
- inline Ebene3D operator*(const T& r) const
- {
- return Ebene3D(*this) *= r;
- }
- //! Dividiert die Ebene durch einen Faktor
- //! \param r Der Faktor
- inline Ebene3D operator/(const T& r) const
- {
- return Ebene3D(*this) /= r;
- }
- //! Überprüft zwei Ebenen auf Gleichheit
- //! \param r Die andere Ebene
- inline bool operator==(const Ebene3D& r) const
- {
- return x == r.x && y == r.y && z == r.z && w == r.w;
- }
- //! Überprüft zwei Ebenen auf Ungleichheit
- //! \param r Die andere Ebene
- inline bool operator!=(const Ebene3D& r) const
- {
- return !(*this == r);
- }
- inline Vec3<T> normal() const
- {
- return {x, y, z};
- }
- };
- } // namespace Framework
|