// 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));
        }
Example #2
0
        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());
            }
        }