11 #include <tracking/trackFindingCDC/geometry/GeneralizedCircle.h>
12 #include <tracking/trackFindingCDC/geometry/Vector2D.h>
14 #include <gtest/gtest.h>
17 using namespace TrackFindingCDC;
19 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_Getters)
21 float absError = 10
e-6;
28 GeneralizedCircle circle(n0, n1, n2, n3);
30 EXPECT_NEAR(n0, circle.n0(), absError);
31 EXPECT_NEAR(n1, circle.n1(), absError);
32 EXPECT_NEAR(n2, circle.n2(), absError);
33 EXPECT_NEAR(n3, circle.n3(), absError);
35 EXPECT_NEAR(2.0 * n3, circle.curvature(), absError);
36 EXPECT_NEAR(1.0 / (2.0 * n3), circle.radius(), absError);
38 EXPECT_NEAR(M_PI / 2.0, circle.tangentialPhi(), absError);
40 EXPECT_NEAR(0, circle.impact(), absError);
43 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_orientation)
45 GeneralizedCircle circle(1.0, 0.0, 0.0, 1.0);
46 EXPECT_EQ(ERotation::c_CounterClockwise, circle.orientation());
48 GeneralizedCircle reversedCircle(1.0, 0.0, 0.0, -1.0);
49 EXPECT_EQ(ERotation::c_Clockwise, reversedCircle.orientation());
51 GeneralizedCircle line(1.0, 0.0, 0.0, 0.0);
52 EXPECT_EQ(ERotation::c_CounterClockwise, line.orientation());
54 GeneralizedCircle reversedLine(1.0, 0.0, 0.0, -0.0);
55 EXPECT_EQ(ERotation::c_Clockwise, reversedLine.orientation());
58 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_conformalTranform)
60 Vector2D center(1.0, 0.0);
65 Vector2D firstPos = circle.atArcLength(1);
66 Vector2D secondPos = circle.atArcLength(2);
68 EXPECT_NEAR(1.0, circle.curvature(), 10e-7);
69 EXPECT_NEAR(-M_PI / 2.0, circle.tangentialPhi(), 10e-7);
70 EXPECT_NEAR(0.0, circle.impact(), 10e-7);
71 EXPECT_NEAR(0.0, circle.distance(firstPos), 10e-7);
72 EXPECT_NEAR(0.0, circle.distance(secondPos), 10e-7);
74 circle.conformalTransform();
75 firstPos.conformalTransform();
76 secondPos.conformalTransform();
78 EXPECT_NEAR(0.0, circle.curvature(), 10e-7);
79 EXPECT_NEAR(M_PI / 2.0, circle.tangentialPhi(), 10e-7);
80 EXPECT_NEAR(-1.0 / 2.0, circle.impact(), 10e-7);
82 double firstConformalArcLength = circle.arcLengthTo(firstPos);
83 double secondConformalArcLength = circle.arcLengthTo(secondPos);
84 EXPECT_TRUE(firstConformalArcLength < secondConformalArcLength);
85 EXPECT_LT(firstConformalArcLength, secondConformalArcLength);
87 EXPECT_NEAR(0.0, circle.distance(firstPos), 10e-7);
88 EXPECT_NEAR(0.0, circle.distance(secondPos), 10e-7);
91 GeneralizedCircle conformalCopy = circle.conformalTransformed();
92 EXPECT_NEAR(1.0, conformalCopy.curvature(), 10e-7);
93 EXPECT_NEAR(-M_PI / 2.0, conformalCopy.tangentialPhi(), 10e-7);
94 EXPECT_NEAR(0.0, conformalCopy.impact(), 10e-7);
97 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_closest)
99 GeneralizedCircle circle(0.0, -1.0, 0.0, 1.0 / 2.0);
100 Vector2D up(1.0, 2.0);
101 Vector2D far(4.0, 0.0);
103 EXPECT_EQ(Vector2D(1.0, 1.0), circle.closest(up));
104 EXPECT_EQ(Vector2D(2.0, 0.0), circle.closest(far));
107 double smallAngle = M_PI / 100;
108 Vector2D near(1.0 - cos(smallAngle), sin(smallAngle));
110 Vector2D closestOfNear = circle.closest(near);
111 EXPECT_NEAR(near.x(), closestOfNear.x(), 10e-7);
112 EXPECT_NEAR(near.y(), closestOfNear.y(), 10e-7);
115 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_arcLengthFactor)
117 GeneralizedCircle circle(0.0, -1.0, 0.0, 1.0 / 2.0);
118 double smallAngle = M_PI / 100;
119 Vector2D near(1.0 - cos(smallAngle), sin(smallAngle));
121 double expectedArcLengthFactor = smallAngle / near.cylindricalR();
122 EXPECT_NEAR(expectedArcLengthFactor, circle.arcLengthFactor(near.cylindricalR()), 10e-7);
125 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_arcLengthBetween)
127 GeneralizedCircle circle(0.0, -1.0, 0.0, 1.0 / 2.0);
128 Vector2D origin(0.0, 0.0);
129 Vector2D up(1.0, 2.0);
130 Vector2D down(1.0, -2.0);
131 Vector2D far(4.0, 0.0);
133 double smallAngle = M_PI / 100;
134 Vector2D close(1.0 - cos(smallAngle), sin(smallAngle));
136 EXPECT_NEAR(-M_PI / 2.0, circle.arcLengthBetween(origin, up), 10e-7);
137 EXPECT_NEAR(M_PI / 2.0, circle.arcLengthBetween(origin, down), 10e-7);
139 EXPECT_NEAR(M_PI / 2.0, circle.arcLengthBetween(up, origin), 10e-7);
140 EXPECT_NEAR(-M_PI / 2.0, circle.arcLengthBetween(down, origin), 10e-7);
143 EXPECT_NEAR(M_PI, fabs(circle.arcLengthBetween(origin, far)), 10e-7);
145 EXPECT_NEAR(-smallAngle, circle.arcLengthBetween(origin, close), 10e-7);
147 GeneralizedCircle line(0.0, -1.0, 0.0, 0.0);
148 EXPECT_NEAR(-2, line.arcLengthBetween(origin, up), 10e-7);
149 EXPECT_NEAR(2, line.arcLengthBetween(origin, down), 10e-7);
150 EXPECT_NEAR(0, line.arcLengthBetween(origin, far), 10e-7);
152 GeneralizedCircle reverseLine(0.0, 1.0, 0.0, -0.0);
153 EXPECT_NEAR(2, reverseLine.arcLengthBetween(origin, up), 10e-7);
154 EXPECT_NEAR(-2, reverseLine.arcLengthBetween(origin, down), 10e-7);
155 EXPECT_NEAR(0, reverseLine.arcLengthBetween(origin, far), 10e-7);
158 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_passiveMoveBy)
160 Vector2D center(4.0, 2.0);
164 circle.passiveMoveBy(Vector2D(3.0, 3.0));
166 EXPECT_NEAR(5.0, circle.radius(), 10e-7);
167 EXPECT_NEAR(1.0, circle.center().x(), 10e-7);
168 EXPECT_NEAR(-1.0, circle.center().y(), 10e-7);
171 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_intersections)
175 GeneralizedCircle line = GeneralizedCircle(sqrt(2.0), -Vector2D(1.0, 1.0).unit());
177 std::pair<Vector2D, Vector2D> intersections = circle.intersections(line);
179 const Vector2D& intersection1 = intersections.first;
180 const Vector2D& intersection2 = intersections.second;
182 EXPECT_NEAR(1 - sqrt(2.0) / 2.0, intersection1.x(), 10e-7);
183 EXPECT_NEAR(1 + sqrt(2.0) / 2.0, intersection1.y(), 10e-7);
185 EXPECT_NEAR(1 + sqrt(2.0) / 2.0, intersection2.x(), 10e-7);
186 EXPECT_NEAR(1 - sqrt(2.0) / 2.0, intersection2.y(), 10e-7);
189 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_atArcLength)
192 Vector2D center = Vector2D(2.0, 0.0);
196 double smallAngle = M_PI / 100;
197 Vector2D near(2.0 - cos(smallAngle), sin(smallAngle));
199 double nearArcLength =
200 -smallAngle * radius;
202 Vector2D atNear = circle.atArcLength(nearArcLength);
204 EXPECT_NEAR(near.x(), atNear.x(), 10e-7);
205 EXPECT_NEAR(near.y(), atNear.y(), 10e-7);
207 Vector2D down(2.0, -1.0);
208 double downArcLength =
209 +M_PI / 2.0 * radius;
211 Vector2D atDown = circle.atArcLength(downArcLength);
213 EXPECT_NEAR(down.x(), atDown.x(), 10e-7);
214 EXPECT_NEAR(down.y(), atDown.y(), 10e-7);
217 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_arcLengthToCylindricalR)
220 Vector2D center = Vector2D(2.0, 0.0);
224 double closestArcLength = circle.arcLengthToCylindricalR(1);
225 EXPECT_NEAR(0, closestArcLength, 10e-7);
227 double widestArcLength = circle.arcLengthToCylindricalR(3);
228 EXPECT_NEAR(M_PI, widestArcLength, 10e-7);
230 double halfArcLength = circle.arcLengthToCylindricalR(sqrt(5.0));
231 EXPECT_NEAR(M_PI / 2, halfArcLength, 10e-7);
233 double unreachableHighArcLength = circle.arcLengthToCylindricalR(4);
234 EXPECT_TRUE(std::isnan(unreachableHighArcLength));
236 double unreachableLowArcLength = circle.arcLengthToCylindricalR(0.5);
237 EXPECT_TRUE(std::isnan(unreachableLowArcLength));
240 GeneralizedCircle reversedCircle = circle.reversed();
242 double closestArcLength = reversedCircle.arcLengthToCylindricalR(1);
243 EXPECT_NEAR(0, closestArcLength, 10e-7);
245 double widestArcLength = reversedCircle.arcLengthToCylindricalR(3);
246 EXPECT_NEAR(M_PI, widestArcLength, 10e-7);
248 double halfArcLength = reversedCircle.arcLengthToCylindricalR(sqrt(5.0));
249 EXPECT_NEAR(M_PI / 2, halfArcLength, 10e-7);
251 double unreachableHighArcLength = reversedCircle.arcLengthToCylindricalR(4);
252 EXPECT_TRUE(std::isnan(unreachableHighArcLength));
254 double unreachableLowArcLength = reversedCircle.arcLengthToCylindricalR(0.5);
255 EXPECT_TRUE(std::isnan(unreachableLowArcLength));
259 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_atCylindricalR)
262 Vector2D center = Vector2D(2.0, 0.0);
265 std::pair<Vector2D, Vector2D> solutions = circle.atCylindricalR(sqrt(5.0));
267 EXPECT_NEAR(2, solutions.first.x(), 10e-7);
268 EXPECT_NEAR(1, solutions.first.y(), 10e-7);
270 EXPECT_NEAR(2, solutions.second.x(), 10e-7);
271 EXPECT_NEAR(-1, solutions.second.y(), 10e-7);
274 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_isLine)
277 Vector2D center = Vector2D(2.0, 0.0);
280 EXPECT_FALSE(circle.isLine());
283 float phi0 = M_PI / 2;
287 EXPECT_TRUE(line.isLine());
290 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_isCircle)
293 Vector2D center = Vector2D(2.0, 0.0);
296 EXPECT_TRUE(circle.isCircle());
299 float phi0 = M_PI / 2;
303 EXPECT_FALSE(line.isCircle());
306 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_perigeeConversion)
308 float curvature = -0.5;
309 float phi0 = M_PI / 2;
313 EXPECT_NEAR(impact, circle.impact(), 10e-7);
314 EXPECT_NEAR(phi0, circle.tangentialPhi(), 10e-7);
315 EXPECT_NEAR(curvature, circle.curvature(), 10e-7);
318 TEST(TrackFindingCDCTest, geometry_GeneralizedCircle_distance)
320 float absError = 10
e-6;
323 Vector2D center = Vector2D(0.5, 0.0);
327 Vector2D testPoint(3, 0);
329 EXPECT_NEAR(1, circle.distance(testPoint), absError);
330 EXPECT_NEAR(1, circle.absDistance(testPoint), absError);
333 EXPECT_NEAR(1.33333, circle.fastDistance(testPoint), absError);
338 EXPECT_NEAR(-1, circle.distance(testPoint), absError);
339 EXPECT_NEAR(1, circle.absDistance(testPoint), absError);
340 EXPECT_NEAR(-1.33333, circle.fastDistance(testPoint), absError);