Line data Source code
1 : #include <limits>
2 : #include <cmath>
3 : #include "kiss/logger.h"
4 : #include "crpropa/Geometry.h"
5 :
6 : #include <iostream>
7 :
8 : namespace crpropa {
9 :
10 : // Plane ------------------------------------------------------------------
11 1 : Plane::Plane(const Vector3d& _x0, const Vector3d& _n) : x0(_x0), n(_n) {
12 1 : };
13 :
14 0 : Plane::Plane(const Vector3d& _x0, const Vector3d& v1,const Vector3d& v2) : x0(_x0), n(0,0,0) {
15 : n = v1.cross(v2);
16 : n /= n.getR();
17 0 : };
18 :
19 2 : double Plane::distance(const Vector3d &x) const {
20 : Vector3d dX = x - x0;
21 2 : return n.dot(dX);
22 : };
23 :
24 0 : std::string Plane::getDescription() const {
25 0 : std::stringstream ss;
26 : ss << "Plane: " << std::endl
27 0 : << " x0: " << x0 << std::endl
28 0 : << " n: " << n << std::endl;
29 0 : return ss.str();
30 0 : };
31 :
32 0 : Vector3d Plane::normal(const Vector3d& point) const {
33 0 : return n;
34 : }
35 :
36 :
37 : // Sphere ------------------------------------------------------------------
38 4 : Sphere::Sphere(const Vector3d& _center, double _radius) : center(_center), radius(_radius) {
39 4 : };
40 :
41 12 : double Sphere::distance(const Vector3d &point) const {
42 : Vector3d dR = point - center;
43 12 : return dR.getR() - radius;
44 : }
45 :
46 0 : Vector3d Sphere::normal(const Vector3d& point) const {
47 : Vector3d d = point - center;
48 0 : return d.getUnitVector();
49 : }
50 :
51 0 : std::string Sphere::getDescription() const {
52 0 : std::stringstream ss;
53 : ss << "Sphere: " << std::endl
54 0 : << " Center: " << center << std::endl
55 0 : << " Radius: " << radius << std::endl;
56 0 : return ss.str();
57 0 : };
58 :
59 :
60 : // ParaxialBox -------------------------------------------------------------
61 1 : ParaxialBox::ParaxialBox(const Vector3d& _corner, const Vector3d& _size) : corner(_corner), size(_size) {
62 1 : };
63 :
64 6 : double ParaxialBox::distance(const Vector3d &point) const {
65 : Vector3d X = point - corner - size/2.;
66 :
67 : // inside the cube
68 6 : if ((fabs(X.x) <= size.x/2.) and (fabs(X.y) <= size.y/2.) and (fabs(X.z) <= size.z/2.)) {
69 : Vector3d Xp = size/2. - X.abs();
70 3 : double d = std::min(Xp.x, std::min(Xp.y, Xp.z));
71 :
72 3 : return -1. * d;
73 : }
74 :
75 3 : double a = std::max(0., fabs(X.x) - size.x/2.);
76 3 : double b = std::max(0., fabs(X.y) - size.y/2.);
77 3 : double c = std::max(0., fabs(X.z) - size.z/2.);
78 :
79 3 : return sqrt(a*a + b*b +c*c);
80 : }
81 :
82 0 : Vector3d ParaxialBox::normal(const Vector3d& point) const {
83 : Vector3d d = (point - corner).abs();
84 : Vector3d d2 = d + size;
85 : Vector3d n;
86 : double dmin = std::numeric_limits<double>::infinity();
87 0 : if (d.x < dmin) {
88 : dmin = d.x;
89 : n = Vector3d(-1, 0, 0);
90 : }
91 0 : if (d.y < dmin) {
92 : dmin = d.y;
93 : n = Vector3d(0, -1, 0);
94 : }
95 0 : if (d.z < dmin) {
96 : dmin = d.z;
97 : n = Vector3d(0, 0, -1);
98 : }
99 0 : if (d2.x < dmin) {
100 : dmin = d2.x;
101 : n = Vector3d(1, 0, 0);
102 : }
103 0 : if (d2.y < dmin) {
104 : dmin = d2.y;
105 : n = Vector3d(0, 1, 0);
106 : }
107 0 : if (d2.z < dmin) {
108 : // dmin = d2.z;
109 : n = Vector3d(0, 0, 1);
110 : }
111 :
112 0 : return n;
113 : }
114 :
115 0 : std::string ParaxialBox::getDescription() const {
116 0 : std::stringstream ss;
117 : ss << "ParaxialBox: " << std::endl
118 0 : << " corner: " << corner << std::endl
119 0 : << " size: " << size << std::endl;
120 0 : return ss.str();
121 0 : };
122 :
123 :
124 : } // namespace
|