00001 #ifndef PLANE_H_IS_INCLUDED
00002 #define PLANE_H_IS_INCLUDED
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "mlib/point2.H"
00012 #include "mlib/point3.H"
00013
00014 namespace mlib {
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 template <class PLANE, class P, class V, class L>
00036 class Plane
00037 {
00038
00039 protected:
00040
00041 V _normal;
00042 double _d;
00043
00044 public:
00045
00046
00047
00048
00049
00050
00051
00052
00053 Plane() : _d(0) {}
00054
00055
00056
00057
00058 Plane(const V &n, double d) : _normal(n.normalized()),_d(d) {}
00059
00060
00061
00062 Plane(const P &p, const V&n): _normal(n.normalized()),_d((P()-p)*_normal) {}
00063
00064
00065
00066 Plane(const P &p1, const P&p2, const P&p3)
00067 { *this = Plane<PLANE,P,V,L>(p1, cross(p3-p1, p2-p1)); }
00068
00069
00070
00071 Plane(const P &, const V&, const V&);
00072
00073
00074 Plane(const P plg[], int n);
00075
00076
00077
00078 Plane(const P plg[], int n, const V& normal);
00079
00080
00081
00082
00083
00084
00085 V &normal () { return _normal; }
00086 const V &normal () const { return _normal; }
00087
00088 double &d () { return _d; }
00089 double d () const { return _d; }
00090
00091
00092
00093
00094
00095
00096 P origin () const { return P()-_normal*_d; }
00097
00098
00099 bool is_valid () const
00100 { return fabs(_normal.length() - 1) < epsNorMath(); }
00101
00102
00103
00104
00105
00106
00107
00108 bool is_parallel(const PLANE &p) const
00109 { return _normal.is_equal(p._normal) || _normal.is_equal(-p._normal); }
00110
00111
00112 bool is_equal (const PLANE &p) const
00113 { return (_d*_normal).is_equal(p._d*p._normal); }
00114
00115
00116
00117
00118
00119
00120
00121 PLANE operator -() const { return PLANE(-_normal, -_d); }
00122
00123
00124
00125
00126
00127
00128
00129 P project (const P & )const;
00130
00131 V project (const V & )const;
00132
00133 L project (const L & )const;
00134
00135
00136
00137
00138
00139 double dist (const P &p)const { return (p-P())*_normal+_d; }
00140
00141
00142 P intersect(const L &l) const
00143 { return plane_intersect(l.point(), l.vector(), origin(), _normal); }
00144
00145 };
00146
00147 }
00148
00149 namespace mlib {
00150
00151
00152
00153
00154 template <class P, class V>
00155 inline
00156 P
00157 plane_intersect(
00158 const P &pt,
00159 const V &D,
00160 const P &O,
00161 const V &N)
00162 {
00163 double t = (fabs(D*N) > 0.000001) ? ((O-pt) * N) / (D*N) : -1;
00164
00165 return pt + t * D;
00166 }
00167
00168
00169 template <class P, class V>
00170 inline
00171 double
00172 axis_ang(
00173 const P &p1,
00174 const P &p2,
00175 const P &axispt,
00176 const V &axis)
00177 {
00178 V v1 = (p1 - axispt).normalized();
00179 V v2 = (p2 - axispt).normalized();
00180 double ang = Acos(v1*v2);
00181 if (cross(v1,v2) * axis < 0)
00182 ang = -ang;
00183 return ang;
00184 }
00185
00186 }
00187
00188 #ifdef JOT_NEEDS_TEMPLATES_IN_H_FILE
00189 #include "plane.C"
00190 #endif
00191
00192 #endif // PLANE_H_IS_INCLUDED