00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef HEP_PLANE3D_H
00012 #define HEP_PLANE3D_H
00013
00014 #include "CLHEP/Geometry/Point3D.h"
00015 #include "CLHEP/Geometry/Normal3D.h"
00016 #include "CLHEP/config/iostream.h"
00017
00024 class HepPlane3D {
00025 protected:
00026 double aa, bb, cc, dd;
00027
00028 public:
00036 HepPlane3D(double a=0, double b=0, double c=0, double d=0)
00037 : aa(a), bb(b), cc(c), dd(d) {}
00038
00040 HepPlane3D(const HepNormal3D &n, const HepPoint3D &p)
00041 : aa(n.x()), bb(n.y()), cc(n.z()), dd(-n*p) {}
00042
00044 HepPlane3D(const HepPoint3D &p1, const HepPoint3D &p2, const HepPoint3D &p3)
00045 {
00046 HepNormal3D n = (p2-p1).cross(p3-p1);
00047 aa = n.x(); bb = n.y(); cc = n.z(); dd = -n*p1;
00048 }
00049
00051 HepPlane3D(const HepPlane3D &plane)
00052 : aa(plane.aa), bb(plane.bb), cc(plane.cc), dd(plane.dd) {}
00053
00055 ~HepPlane3D() {};
00056
00058 HepPlane3D& operator=(const HepPlane3D &plane) {
00059 aa = plane.aa; bb = plane.bb; cc = plane.cc; dd = plane.dd; return *this;
00060 }
00061
00063 bool operator == (const HepPlane3D& p) const {
00064 return aa == p.aa && bb == p.bb && cc == p.cc && dd == p.dd;
00065 }
00066
00068 bool operator != (const HepPlane3D& p) const {
00069 return aa != p.aa || bb != p.bb || cc != p.cc || dd != p.dd;
00070 }
00071
00073 HepPlane3D& normalize() {
00074 double ll = sqrt(aa*aa + bb*bb + cc*cc);
00075 if (ll > 0.0) { aa /= ll; bb /= ll; cc /= ll, dd /= ll; }
00076 return *this;
00077 }
00078
00080 double a() const { return aa; }
00082 double b() const { return bb; }
00084 double c() const { return cc; }
00086 double d() const { return dd; }
00087
00089 HepNormal3D normal() const { return HepNormal3D(aa,bb,cc); }
00090
00092 double distance(const HepPoint3D &p) const {
00093 return aa*p.x() + bb*p.y() + cc*p.z() + dd;
00094 }
00095
00097 HepPoint3D point(const HepPoint3D &p) const {
00098 double k = distance(p)/(aa*aa+bb*bb+cc*cc);
00099 return HepPoint3D(p.x()-aa*k, p.y()-bb*k, p.z()-cc*k);
00100 }
00101
00103 HepPoint3D point() const {
00104 double k = -dd/(aa*aa+bb*bb+cc*cc);
00105 return HepPoint3D(aa*k, bb*k, cc*k);
00106 }
00107
00109 HepPlane3D& transform(const HepTransform3D &m) {
00110 HepNormal3D n(aa,bb,cc);
00111 n.transform(m);
00112 dd = -n*point().transform(m); aa = n.x(); bb = n.y(); cc = n.z();
00113 return *this;
00114 }
00115 };
00116
00121 HepStd::ostream & operator << (HepStd::ostream &, const HepPlane3D &);
00122
00123 #endif