00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _GFX_PLANE_
00026 #define _GFX_PLANE_
00027
00028 #include <gfx/gfx>
00029 #include <base/Point3>
00030 #include <base/Vector3>
00031 #include <gfx/Triangle3>
00032
00033 #include <iostream>
00034
00035
00036 namespace gfx {
00037
00038
00039 class Plane
00040 {
00041
00042 public:
00043 Plane() {}
00044
00045 Plane(const Vector3& normal, Real p)
00046 : normal(normal), p(p) { this->normal.normalize(); }
00047
00048 Plane(Real a, Real b, Real c, Real d)
00049 : normal(a,b,c)
00050 { p = d/normal.length(); normal.normalize(); }
00051
00052 Plane(const Point3& p1, const Point3& p2, const Point3& p3)
00053 {
00054 normal = cross(p1-p2,p3-p2); normal.normalize();
00055 p = -dot(normal,p1);
00056 }
00057
00058 Plane(const Triangle3& t)
00059 {
00060 normal = cross(t.p1()-t.p2(),t.p3()-t.p2()); normal.normalize();
00061 p = -dot(normal,t.p1());
00062 }
00063
00064 virtual ~Plane() {}
00065
00066 Real distanceTo(const Point3& pt) const
00067 { return Math::abs(dot(normal,pt) + p); }
00068
00069 bool contains(const Point3& p) const
00070 { return Math::equals(distanceTo(p),0); }
00071
00072 Real classify(const Vector3& v) const
00073 { return dot(normal,v) + p; }
00074
00075 Vector3 normal;
00076 Real p;
00077 };
00078
00079
00080
00081
00082 inline std::ostream& operator<<(std::ostream& out, const Plane& p)
00083 { return out << "(" << p.normal << "," << p.p << ")"; }
00084
00085
00086 }
00087
00088 #endif