00001
00002
00003
00004 #ifndef LAYEREDMEDIUM_H
00005 #define LAYEREDMEDIUM_H
00006
00007 #include "gismo/CompositeMedium.h"
00008 #include "geometry/Volume.h"
00009
00018 class LayeredMedium : public CompositeMedium {
00019 public:
00020
00022 virtual ~LayeredMedium();
00023
00024 virtual double distanceToLeave( const Ray& r, const Medium*& nextMedium, double maxStep ) const;
00025
00026
00027
00029 virtual double distanceToEnter( const Ray& r, const Medium*& nextMedium, double maxStep) const;
00030
00031 const Medium* inside(const Point& x)const;
00032
00034 virtual void createDetectorView(gui::DisplayRep& v){};
00035
00036
00037
00038 LayeredMedium(Medium* mother, int num_sufaces, double inner_offset=0);
00039
00040
00041
00042 Medium& addLayer(Medium * inner_medium, double thickness);
00043
00044
00045
00046
00047
00048 virtual const Medium* select(const Point& x)const;
00049
00050
00051
00052 class Slice;
00053 class Volume;
00054
00055
00056
00057 class Slice : public ::Volume {
00058 public:
00059 Slice(LayeredMedium& mother, int index);
00060 ~Slice();
00061
00062 const char* nameOf()const{return "LayeredMedium::Slice";}
00063
00064 double distanceToLeave(const Ray& r, double d)const;
00065
00066
00067 const ::Volume& setMotherVolume()const;
00068
00069
00070 const ::Volume& resetMotherVolume()const;
00071
00072
00073 void printOn(std::ostream& out)const;
00074
00075 virtual GeomObject& transform(const CoordTransform& ){return *this;};
00076
00077
00078 private:
00079 LayeredMedium& m_mother;
00080 int m_index;
00081
00082
00083 };
00084
00085
00086 const Surface& referenceSurface()const;
00087
00088
00089
00090
00091 class Volume : public ::Volume {
00092 public:
00093 Volume(int n);
00094
00095 void setSurface(int n, Surface* surf){ operator[](n)=surf;}
00096 Surface& surface(int n){return *operator[](n);}
00097
00098
00099 void setOffsets(double inner, double outer);
00100
00101
00102 const char* nameOf()const{return "LayeredMedium::Volume";}
00103 private:
00104 };
00105
00106
00107 friend class Slice;
00108
00109 std::vector<double> m_offset;
00110
00111
00112 Volume* m_vol;
00113
00114 private:
00115
00116 int m_select_index;
00117 int m_last_boundary;
00118
00119 };
00120
00121 #endif
00122