00001 // $Id: SolidIntersection.h,v 1.14 2007/03/16 15:57:09 cattanem Exp $ 00003 #ifndef DETDESC_SOLIDINTERSECTION_H 00004 #define DETDESC_SOLIDINTERSECTION_H 1 00005 // STD & STL 00006 #include <algorithm> 00007 #include <functional> 00009 #include "DetDesc/ISolid.h" 00010 #include "DetDesc/SolidBoolean.h" 00011 #include "DetDesc/SolidChild.h" 00013 template <class TYPE> 00014 class SolidFactory; 00015 00016 00025 class SolidIntersection: public SolidBoolean 00026 { 00028 friend class SolidFactory<SolidIntersection>; 00029 00030 public: 00031 00037 SolidIntersection( const std::string& name , ISolid* first ); 00038 00040 virtual ~SolidIntersection(); 00041 00042 public: 00043 00047 virtual std::string typeName () const { return "SolidIntersection" ; }; 00048 00057 bool isInside ( const Gaudi::XYZPoint & ) const ; 00058 bool isInside ( const Gaudi::Polar3DPoint& point ) const ; 00059 bool isInside ( const Gaudi::RhoZPhiPoint& point ) const ; 00065 StatusCode intersect( ISolid* solid , 00066 const Gaudi::Transform3D* mtrx ); 00067 00074 StatusCode intersect( ISolid* child , 00075 const Gaudi::XYZPoint& position , 00076 const Gaudi::Rotation3D& rotation = Gaudi::Rotation3D() ); 00077 protected: 00078 00082 SolidIntersection( const std::string& name = "Anonymous Intersection" ); 00083 00084 private: 00085 00086 SolidIntersection ( const SolidIntersection& ); 00087 SolidIntersection& operator=( const SolidIntersection& ); 00088 00094 template <class aPoint> 00095 bool isInsideImpl(const aPoint& point) const; 00096 00097 }; 00098 00100 #endif 00101 00102 00103 00104 00105