00001
00002
00003 #ifndef DETDESC_SOLIDPOLYHEDRONHELPER_H
00004 #define DETDESC_SOLIDPOLYHEDRONHELPER_H 1
00006 #include <vector>
00008 #include "GaudiKernel/Point3DTypes.h"
00009 #include "GaudiKernel/Plane3DTypes.h"
00011 #include "DetDesc/SolidBase.h"
00012 #include "DetDesc/SolidException.h"
00013 #include "DetDesc/SolidTicks.h"
00014
00015
00025 class SolidPolyHedronHelper: virtual public SolidBase
00026 {
00028 public:
00029
00031 typedef std::vector<Gaudi::Plane3D> PLANES ;
00032 typedef std::vector<Gaudi::XYZPoint> VERTICES ;
00033
00034 public:
00035
00044 virtual bool isInside ( const Gaudi::XYZPoint& point ) const ;
00045 virtual bool isInside ( const Gaudi::Polar3DPoint & point ) const;
00046 virtual bool isInside ( const Gaudi::RhoZPhiPoint & point ) const;
00066 virtual unsigned int intersectionTicks( const Gaudi::XYZPoint & Point,
00067 const Gaudi::XYZVector& Vector,
00068 ISolid::Ticks& ticks ) const ;
00069
00070 virtual unsigned int intersectionTicks( const Gaudi::Polar3DPoint & Point,
00071 const Gaudi::Polar3DVector & Vector,
00072 ISolid::Ticks & ticks) const ;
00073
00074 virtual unsigned int intersectionTicks( const Gaudi::RhoZPhiPoint & Point,
00075 const Gaudi::RhoZPhiVector & Vector,
00076 ISolid::Ticks & ticks) const ;
00081 Ticks::size_type maxNumberOfTicks() const ;
00082
00083 protected:
00084
00088 SolidPolyHedronHelper ( const std::string& Name = "Anonymous PoliHedron");
00089
00091 virtual ~SolidPolyHedronHelper ();
00092
00101 bool addFace
00102 ( const Gaudi::XYZPoint& Point1 ,
00103 const Gaudi::XYZPoint& Point2 ,
00104 const Gaudi::XYZPoint& Point3 );
00105
00116 bool addFace
00117 ( const Gaudi::XYZPoint& Point1 ,
00118 const Gaudi::XYZPoint& Point2 ,
00119 const Gaudi::XYZPoint& Point3 ,
00120 const Gaudi::XYZPoint& Point4 );
00121
00125 inline const PLANES& planes () const { return m_ph_planes ; }
00126
00131 template<class aPoint>
00132 inline bool inside
00133 ( const aPoint& Point ,
00134 const Gaudi::Plane3D& Plane ) const
00135 { return 0 >= Plane.Distance( Point ) ; };
00136
00139 void setBP();
00140
00141 private:
00147 template<class aPoint>
00148 bool isInsideImpl(const aPoint& point) const;
00149
00150 template<class aPoint, class aVector>
00151 unsigned int intersectionTicksImpl( const aPoint & Point,
00152 const aVector & Vector,
00153 ISolid::Ticks& ticks ) const;
00154
00155 protected:
00156
00158 PLANES m_ph_planes ;
00159 VERTICES m_ph_vertices ;
00160
00161 };
00162
00163
00164
00165
00166 #endif
00167 // ===========================================================================