public static PointResult2f LineIntersectsRay(IList <Vector2f> line, Vector2f p, Vector2f n, bool reverse = false) { int count = line.Count; for (int i = 0; i < count - 1; i++) { int I0 = i; int I1 = i + 1; if (reverse) { I0 = count - i - 2; I1 = count - i - 1; } Vector2f a = line[I0]; Vector2f b = line[I1]; float t; if (RayIntersectsSegment(p, n, a, b, out t)) { PointResult2f result = new PointResult2f(); result.Hit = true; result.Point = a + t * (b - a); result.T = t; result.A = I0; result.B = I1; return(result); } } return(PointResult2f.NoHit); }
public static PointResult2f ClosestPoint(IList <Vector2f> line, Vector2f point) { float dist = float.PositiveInfinity; PointResult2f result = new PointResult2f(); Segment2f seg; int count = line.Count; for (int i = 0; i < count - 1; i++) { int I0 = i; int I1 = i + 1; seg.A = line[I0]; seg.B = line[I1]; float t; SegmentIntersections2f.ClosestPointOnSegment(seg, point, out t); Vector2f closest = seg.A + (seg.B - seg.A) * t; float d2 = Vector2f.SqrDistance(closest, point); if (d2 < dist) { result.Hit = true; result.Point = closest; result.T = t; result.A = I0; result.B = I1; dist = d2; } } return(result); }