TrkSurfaces: Fix bugs in CylinderSurface::straightLineIntersection.
CylinderSurface::straightLineIntersection has a couple serious bugs that appear to have been there since it was first written.
We had
if (needsTransform){
Amg::Transform3D invTrans = transform().inverse();
point1 = invTrans*pos;
direction = invTrans.linear()*dir;
}
Amg::Vector3D point2 = point1 + dir;
where point1 and point2 are meant to be points along the supplied line,
after the reference frame transform. But the last line here uses the
direction vector before the transform, rather than after. It should
use direction', rather than
dir'.
But, in fact, the expression
double d = (point2.x()*point1.y() - point1.x()*point2.y())/(point2.x()-point1.x());
can be written more efficiently as
double d = point1.y() - point1.x()*k;
in which case, we no longer need the point2 variable. Writing it this way probably also has better precision, since we avoid subtracting large numbers that are close together.
Further, in the section handling the case where direction.x()==0, we have
t1 = y-point1.y();
t2 = -y-point1.y();
which is not correct, since t1 and t2 are meant to be the 3D distances to the intersection; what we have here is the 2D projection. We instead need to do
t1 = (y-point1.y())/direction.y();
t2 = (-y-point1.y())/direction.y();
The code also does not handle the case when both direction.x() and direction.y() are 0.
Finally, we can change some of the repeated divisions by the same value to multiplication by a reciprocal.
Also add a rudimentary unit test for this functionality.