16 return arg * line.fSlope + line.fIntercept;
21 const float val =
std::sqrt(circle.fRadius * circle.fRadius - arg * arg);
22 return circle.fOrigin.fX > 0 ? circle.fOrigin.fX - val : circle.fOrigin.fX + val;
25 inline Line PointsToLine(
float abscissa1,
float ordinate1,
float abscissa2,
float ordinate2) noexcept
28 const float slope = (ordinate1 - ordinate2) / (abscissa1 - abscissa2);
29 const float intercept = ordinate1 - abscissa1 * slope;
30 return {slope, intercept};
36 return PointsToLine(point1.fAbscissa, point1.fOrdinate, point2.fAbscissa, point2.fOrdinate);
42 return PointsToLine(straw1.fZ, straw1.fX, straw2.fZ, straw2.fX);
48 return PointsToLine(point1.fZ, point1.fX, point2.fZ, point2.fX);
54 return PointsToLine(point1.fZ, point1.fY, point2.fZ, point2.fY);
60 return std::fabs(point.fOrdinate - line.fSlope * point.fAbscissa - line.fIntercept) /
std::sqrt(line.fSlope * line.fSlope + 1);
66 return std::fabs(straw.fX - line.fSlope * straw.fZ - line.fIntercept) /
std::sqrt(line.fSlope * line.fSlope + 1);
72 return std::fabs(point.fY - line.fSlope * point.fZ - line.fIntercept) /
std::sqrt(line.fSlope * line.fSlope + 1);
78 const float distSq = (p.fZ - s.fZ) * (p.fZ - s.fZ) + (p.fX - s.fX) * (p.fX - s.fX);
79 const float distMinusRsq =
std::sqrt(distSq - r * r);
80 const float x = s.fX + r * (r * (p.fX - s.fX) -
sign * (p.fZ - s.fZ) * distMinusRsq) / distSq;
81 const float z = s.fZ + r * (r * (p.fZ - s.fZ) +
sign * (p.fX - s.fX) * distMinusRsq) / distSq;
88 const float xTangency =
LineValue(xzLine, zTangency);
90 const Line tanOriLine{-1 / xzLine.
fSlope, xTangency + zTangency / xzLine.
fSlope};
93 const XZPoint tanStrawMid{0.5f * (xTangency + straw.
fX + isochrone), 0.5
f * (zTangency + straw.
fZ)};
95 const Line midOriLine{-1 / tanStrawLine.
fSlope, tanStrawMid.fX + tanStrawMid.fZ / tanStrawLine.
fSlope};
97 const float originZ = (midOriLine.fIntercept - tanOriLine.fIntercept) / (tanOriLine.fSlope - midOriLine.fSlope);
98 const float originX =
LineValue(midOriLine, originZ);
100 const XZPoint origin{originX, originZ};
101 const float radius =
std::sqrt(std::pow(zTangency - origin.fZ, 2.f) + std::pow(xTangency - origin.fX, 2.f));
103 return {radius, origin};
108 const float strawOriDistSq = std::pow(straw.fX - circle.fOrigin.fX, 2.f) + std::pow(straw.fZ - circle.fOrigin.fZ, 2.f);
109 const float strawOriDist =
std::sqrt(strawOriDistSq);
111 return std::abs(circle.fRadius - strawOriDist);
116 const double radiusSq = std::pow(circle.fRadius, 2);
117 const double zDistSq = std::pow(zCoord - circle.fOrigin.fZ, 2);
118 return static_cast<float>(
std::sqrt(std::abs(radiusSq - zDistSq)));
friend F32vec4 sqrt(const F32vec4 &a)
float StrawCircleDistance(const PndFtsStraw &straw, const Circle &circle) noexcept
Circle LineStrawCircle(const Line &xzLine, const float zTangency, const PndFtsStraw &straw, const float isochrone=0.) noexcept
float StrawXZLineDistance(const PndFtsStraw &straw, const Line &line) noexcept
float LineYZPointDistance(const YZVirtualHit &point, const Line &line) noexcept
Line PointsToLine(float abscissa1, float ordinate1, float abscissa2, float ordinate2) noexcept
float XZCircleXCoord(const Circle &circle, const float zCoord) noexcept
float PointLineDistance(const Point2D &point, const Line &line) noexcept
Line XZStrawsToLine(const PndFtsStraw &straw1, const PndFtsStraw &straw2) noexcept
float LineValue(const Line &line, const float arg) noexcept
XZPoint TangencyPoint(const float r, const XZPoint &s, const XZPoint &p, const float sign) noexcept
friend F32vec4 fabs(const F32vec4 &a)
float CircleValue(const Circle &circle, const float arg) noexcept
Line YZPointsToLine(const YZVirtualHit &point1, const YZVirtualHit &point2) noexcept
float fZ
Coordinates of the straw in PANDA's coordinate system.
Line XZPointsToLine(const XZPoint &point1, const XZPoint &point2) noexcept