Line data Source code
1 : #ifndef CRPROPA_GEOMETRY_H
2 : #define CRPROPA_GEOMETRY_H
3 :
4 : #include <vector>
5 : #include <string>
6 :
7 : #include "crpropa/Candidate.h"
8 : #include "crpropa/Vector3.h"
9 : #include "crpropa/Referenced.h"
10 :
11 : namespace crpropa {
12 : /**
13 : * \addtogroup Core
14 : * @{
15 : */
16 :
17 : /**
18 : @class Surface
19 : @brief A geometrical surface
20 :
21 : Defines a surface. Can be queried if the candidate has crossed the surface in the last step.
22 : */
23 : class Surface : public Referenced {
24 : public:
25 : /** Returns the distance of a point to the surface. Negative on the one side,
26 : positive on the other. For closed surfaces it is negative on the inside.
27 : @param point vector corresponding to the point to which compute the distance
28 : */
29 : virtual double distance(const Vector3d& point) const = 0;
30 : /** Returns the normal to the surface at a point. Negative on the one side,
31 : positive on the other. For closed surfaces it is negative on the inside.
32 : @param point vector corresponding to the point to which compute the normal vector
33 : */
34 : virtual Vector3d normal(const Vector3d& point) const = 0;
35 0 : virtual std::string getDescription() const {return "Surface without description.";};
36 : };
37 :
38 :
39 : /**
40 : @class Plane
41 : @brief A plane given by a point x0 and two axes v1 and v2 with normal n = v1.cross(v2) or the normal n. Note that distance is negative on one side of the plane and positive on the other, depending on the orientation of the normal vector.
42 : */
43 1 : class Plane: public Surface {
44 : private:
45 : Vector3d x0, n;
46 : public:
47 : Plane(const Vector3d& x0, const Vector3d& v1,const Vector3d& v2);
48 : Plane(const Vector3d& x0, const Vector3d& n);
49 : virtual double distance(const Vector3d &x) const;
50 : virtual Vector3d normal(const Vector3d& point) const;
51 : virtual std::string getDescription() const;
52 : };
53 :
54 :
55 : /**
56 : @class Sphere
57 : @brief A sphere around point _center with radius _radius.
58 : */
59 1 : class Sphere: public Surface {
60 : private:
61 : Vector3d center;
62 : double radius;
63 : public:
64 : Sphere(const Vector3d& center, double radius);
65 : virtual double distance(const Vector3d &point) const;
66 : virtual Vector3d normal(const Vector3d& point) const;
67 : virtual std::string getDescription() const;
68 : };
69 :
70 :
71 : /**
72 : @class ParaxialBox
73 : @brief A box with perpendicular surfaces aligned to the x,y,z-axes.
74 : */
75 1 : class ParaxialBox: public Surface {
76 : private:
77 : Vector3d corner, size;
78 : public:
79 : ParaxialBox(const Vector3d& corner, const Vector3d& size);
80 : virtual double distance(const Vector3d &point) const;
81 : virtual Vector3d normal(const Vector3d& point) const;
82 : virtual std::string getDescription() const;
83 : };
84 :
85 :
86 : /** @}*/
87 : } // namespace crpropa
88 :
89 : #endif // CRPROPA_GEOMETRY_H
|