// http://geomalgorithms.com/a05-_intersect-1.html#intersect2D_2Segments() private static Point?IntersectionPoint(Ray ray, Line l2, bool mustBeBetweenStartAndEnd) { var u = ray.Direction; var v = l2.Direction; var w = ray.Point - l2.StartPoint; var d = Perp(u, v); if (Math.Abs(d) < Constants.Tolerance) { // parallel lines return(null); } var sI = Perp(v, w) / d; var p = ray.Point + sI * u; if (mustBeBetweenStartAndEnd) { if (ray.IsPointOn(p) && l2.IsPointOnLine(p)) { return(p); } return(null); } return(p); }
// http://geomalgorithms.com/a05-_intersect-1.html#intersect2D_2Segments() private static Point? IntersectionPoint(Ray ray, Line l2, bool mustBeBetweenStartAndEnd) { var u = ray.Direction; var v = l2.Direction; var w = ray.Point - l2.StartPoint; var d = Perp(u, v); if (Math.Abs(d) < Constants.Tolerance) { // parallel lines return null; } var sI = Perp(v, w) / d; var p = ray.Point + sI * u; if (mustBeBetweenStartAndEnd) { if (ray.IsPointOn(p) && l2.IsPointOnLine(p)) { return p; } return null; } return p; }