// returns first intersection point with box boundary or null if there are none public static Vector2?MeetingPoint(this Ray2 ray, Box2 box) { var meetingDistance = double.PositiveInfinity; for (Vector2.Axis axis = 0; axis < Vector2.Axis.Count; axis++) { var otherAxis = 1 - axis; for (Interval.EndType end = 0; end < Interval.EndType.Count; end++) { var intersectionDistance = (box.Corner(end)[axis] - ray.Origin[axis]) / ray.Direction[axis]; if (intersectionDistance > 0) { var intersectionCoord = ray.Origin[otherAxis] + ray.Direction[otherAxis] * intersectionDistance; if (box.Range(otherAxis).Contains(intersectionCoord)) { meetingDistance = Math.Min(meetingDistance, intersectionDistance); } } } } if (double.IsPositiveInfinity(meetingDistance)) { return(null); } return(ray.PointAt(meetingDistance)); }
public static Vector2 Corner(this Box2 @this, Interval.EndType end) { switch (end) { case Interval.EndType.Min: return(@this.MinCorner); case Interval.EndType.Max: return(@this.MaxCorner); default: throw new ArgumentOutOfRangeException("end", end, "Illegal EndType " + end.ToString()); } }