Warning, file /include/Acts/Surfaces/detail/LineHelper.hpp was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/Utilities/Intersection.hpp"
0013 #include "Acts/Utilities/MathHelpers.hpp"
0014
0015 namespace Acts::detail::LineHelper {
0016
0017
0018
0019
0020
0021
0022
0023 template <int N>
0024 inline Intersection<N> lineIntersect(const ActsVector<N>& linePosA,
0025 const ActsVector<N>& lineDirA,
0026 const ActsVector<N>& linePosB,
0027 const ActsVector<N>& lineDirB)
0028 requires(N >= 2)
0029 {
0030 static_assert(N >= 2, "One dimensional intersect not sensible");
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042 const double dirDots = lineDirA.dot(lineDirB);
0043 const double divisor = (1. - square(dirDots));
0044
0045
0046 if (std::abs(divisor) < std::numeric_limits<double>::epsilon()) {
0047 return Intersection<N>::Invalid();
0048 }
0049 const ActsVector<N> aMinusB = linePosA - linePosB;
0050 const double pathLength =
0051 (aMinusB.dot(lineDirB) - aMinusB.dot(lineDirA) * dirDots) / divisor;
0052
0053 return Intersection<N>{linePosB + pathLength * lineDirB, pathLength,
0054 IntersectionStatus::onSurface};
0055 }
0056
0057
0058
0059 inline Intersection3D lineSurfaceIntersect(
0060 const Acts::Transform3& lineSurfTrf1,
0061 const Acts::Transform3& lineSurfTrf2) {
0062 return lineIntersect<3>(
0063 lineSurfTrf1.translation(), lineSurfTrf1.linear().col(2),
0064 lineSurfTrf2.translation(), lineSurfTrf2.linear().col(2));
0065 }
0066
0067
0068
0069
0070
0071 inline double signedDistance(const Vector3& linePosA, const Vector3& lineDirA,
0072 const Vector3& linePosB, const Vector3& lineDirB) {
0073
0074 const double dirDots = lineDirA.dot(lineDirB);
0075 const Vector3 aMinusB = linePosA - linePosB;
0076 if (std::abs(dirDots - 1.) < std::numeric_limits<double>::epsilon()) {
0077 return (aMinusB - lineDirA.dot(aMinusB) * lineDirA).norm();
0078 }
0079 const Vector3 projDir = (lineDirA - dirDots * lineDirB).normalized();
0080 return aMinusB.cross(lineDirB).dot(projDir);
0081 }
0082 }