CLHEP/Geometry/Plane3D.h

00001 // -*- C++ -*-
00002 // $Id: Plane3D.h,v 1.16 2002/04/19 16:33:40 evc Exp $
00003 // ---------------------------------------------------------------------------
00004 //
00005 // This file is a part of the CLHEP - a Class Library for High Energy Physics.
00006 //
00007 // History:
00008 // 22.09.96 E.Chernyaev - initial version
00009 // 19.10.96 J.Allison - added == and <<.
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 /* HEP_PLANE3D_H */

Class Library for High Energy Physics (version 1.8)