plane.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:4k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // plane.h
  2. // 
  3. // Copyright (C) 2000-2008, Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #ifndef _CELMATH_PLANE_H_
  10. #define _CELMATH_PLANE_H_
  11. #include <celmath/mathlib.h>
  12. #include <celmath/vecmath.h>
  13. template<class T> class Plane
  14. {
  15.  public:
  16.     inline Plane();
  17.     inline Plane(const Plane<T>&);
  18.     inline Plane(const Vector3<T>&, T);
  19.     inline Plane(const Vector3<T>&, const Point3<T>&);
  20.     T distanceTo(const Point3<T>&) const;
  21.     T distanceToSegment(const Point3<T>&, const Vector3<T>&) const;
  22.     static Point3<T> intersection(const Plane<T>&,
  23.                                   const Plane<T>&,
  24.                                   const Plane<T>&);
  25.  public:
  26.     Vector3<T> normal;
  27.     T d;
  28. };
  29. typedef Plane<float> Planef;
  30. typedef Plane<double> Planed;
  31. template<class T> Plane<T>::Plane() : normal(0, 0, 1), d(0)
  32. {
  33. }
  34. template<class T> Plane<T>::Plane(const Plane<T>& p) :
  35.     normal(p.normal), d(p.d)
  36. {
  37. }
  38. template<class T> Plane<T>::Plane(const Vector3<T>& _normal, T _d) :
  39.     normal(_normal), d(_d)
  40. {
  41. }
  42. template<class T> Plane<T>::Plane(const Vector3<T>& _normal, const Point3<T>& _point) :
  43.     normal(_normal)
  44. {
  45.     d = _normal.x * _point.x + _normal.y * _point.y + _normal.z * _point.z;
  46. }
  47. template<class T> T Plane<T>::distanceTo(const Point3<T>& p) const
  48. {
  49.     return normal.x * p.x + normal.y * p.y + normal.z * p.z + d;
  50. }
  51. // Distance between a plane and a segment defined by orig+dir*t, t <= 0 <= 1
  52. template<class T> T Plane<T>::distanceToSegment(const Point3<T>& origin,
  53.                                                 const Vector3<T>& direction) const
  54. {
  55.     T u = (direction * normal);
  56.     T dist;
  57.     
  58.     // Avoid divide by zero; near-zero values shouldn't cause problems
  59.     if (u == 0)
  60.     {
  61.         // All points equidistant; we can just compute distance to origin
  62.         dist = distanceTo(origin);
  63.     }
  64.     else
  65.     {
  66.         T t = -(d + Vector3<T>(origin.x, origin.y, origin.z) * normal) / u;
  67.         if (t < 0)
  68.         {
  69.             dist = distanceTo(origin);
  70.         }
  71.         else if (t > 1)
  72.         {
  73.             dist = distanceTo(origin + direction);
  74.         }
  75.         else
  76.         {
  77.             // Segment intersects plane
  78.             dist = 0.0;
  79.         }
  80.     }
  81.     
  82.     return dist;
  83. }
  84. template<class T> Plane<T> operator*(const Matrix3<T>& m, const Plane<T>& p)
  85. {
  86.     Vector3<T> v = m * p.normal;
  87.     return Plane<T>(v, p.d);
  88. }
  89. template<class T> Plane<T> operator*(const Plane<T>& p, const Matrix3<T>& m)
  90. {
  91.     Vector3<T> v = p.normal * m;
  92.     return Plane<T>(v, p.d);
  93. }
  94. template<class T> Plane<T> operator*(const Matrix4<T>& m, const Plane<T>& p)
  95. {
  96.     Vector4<T> v = m * Vector4<T>(p.normal.x, p.normal.y, p.normal.z, p.d);
  97.     return Plane<T>(Vector3<T>(v.x, v.y, v.z), v.w);
  98. }
  99. template<class T> Plane<T> operator*(const Plane<T>& p, const Matrix4<T>& m)
  100. {
  101.     Vector4<T> v = Vector4<T>(p.normal.x, p.normal.y, p.normal.z, p.d) * m;
  102.     return Plane<T>(Vector3<T>(v.x, v.y, v.z), v.w);
  103. }
  104. template<class T> Point3<T> Plane<T>::intersection(const Plane<T>& p0,
  105.                                                    const Plane<T>& p1,
  106.                                                    const Plane<T>& p2)
  107. {
  108.     T d = Matrix3<T>(p0.normal, p1.normal, p2.normal).determinant();
  109.     Vector3<T> v = (p0.d * cross(p1.normal, p2.normal) +
  110.                     p1.d * cross(p2.normal, p0.normal) +
  111.                     p2.d * cross(p0.normal, p1.normal)) * (1.0f / d);
  112.     return Point3<T>(v.x, v.y, v.z);
  113. }
  114. #endif // _CELMATH_PLANE_H_