From 2523be8bfbf51bd4b513712dd05b623bfc5b3949 Mon Sep 17 00:00:00 2001 From: Maximilian Reininghaus <maximilian.reininghaus@kit.edu> Date: Tue, 19 Feb 2019 15:48:33 +0100 Subject: [PATCH] made TimeOfIntersection independent of explicit CS --- Processes/TrackingLine/TrackingLine.cc | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/Processes/TrackingLine/TrackingLine.cc b/Processes/TrackingLine/TrackingLine.cc index 2c610c9c2..e19d9077a 100644 --- a/Processes/TrackingLine/TrackingLine.cc +++ b/Processes/TrackingLine/TrackingLine.cc @@ -30,28 +30,23 @@ namespace corsika::process::tracking_line { std::optional<std::pair<corsika::units::si::TimeType, corsika::units::si::TimeType>> TrackingLine<Stack, Trajectory>::TimeOfIntersection(corsika::geometry::Line const& line, geometry::Sphere const& sphere) { - using namespace corsika::units::si; - auto const& cs = fEnvironment.GetCoordinateSystem(); - geometry::Point const origin(cs, 0_m, 0_m, 0_m); + auto const delta = line.GetR0() - sphere.GetCenter(); + auto const v = line.GetV0(); + auto const R = sphere.GetRadius(); - auto const r0 = (line.GetR0() - origin); - auto const v0 = line.GetV0(); - auto const c0 = (sphere.GetCenter() - origin); - - auto const alpha = r0.dot(v0) - 2 * v0.dot(c0); - auto const beta = c0.squaredNorm() + r0.squaredNorm() + 2 * c0.dot(r0) - - sphere.GetRadius() * sphere.GetRadius(); - - auto const discriminant = alpha * alpha - 4 * beta * v0.squaredNorm(); + auto const vDotDelta = v.dot(delta); + auto const discriminant = + vDotDelta * vDotDelta - v.squaredNorm() * (delta.squaredNorm() - R * R); //~ std::cout << "discriminant: " << discriminant << std::endl; //~ std::cout << "alpha: " << alpha << std::endl; //~ std::cout << "beta: " << beta << std::endl; if (discriminant.magnitude() > 0) { - (-alpha - sqrt(discriminant)) / (2 * v0.squaredNorm()); - return std::make_pair((-alpha - sqrt(discriminant)) / (2 * v0.squaredNorm()), - (-alpha + sqrt(discriminant)) / (2 * v0.squaredNorm())); + auto const sqDisc = sqrt(discriminant); + auto const invDenom = 1 / v0.squaredNorm(); + return std::make_pair((vDotDelta - sqDisc) * invDenom), + (vDotDelta + sqDisc) * invDenom)); } else { return {}; } -- GitLab