Beispiel #1
0
        public static float MinimumDistance(Segment2D segment, Circle circle)
        {
            if (Segment2D.Intersects(segment, circle))
            {
                return(0);
            }

            // okay this Max *should be* unnecessary, but lets keep it just for sure
            return(FlaiMath.Max(0, Segment2D.MinimumDistance(segment, circle.Position) - circle.Radius));
        }
Beispiel #2
0
        // is this accurate? could be...
        public static float MaximumDistance(Segment2D segment, RectangleF rectangle)
        {
            if (Segment2D.Intersects(segment, rectangle))
            {
                return(0);
            }

            return(FlaiMath.Max(
                       Segment2D.MaximumDistance(segment, rectangle.TopLeft), Segment2D.MaximumDistance(segment, rectangle.TopRight),
                       Segment2D.MaximumDistance(segment, rectangle.BottomLeft), Segment2D.MaximumDistance(segment, rectangle.BottomRight)));
        }
Beispiel #3
0
        public static bool Intersects(Segment2D segment1, Segment2D segment2)
        {
            Vector2f intersectionPoint;

            return(Segment2D.Intersects(segment1, segment2, out intersectionPoint));
        }
Beispiel #4
0
        // http://stackoverflow.com/a/100165/925777
        public static bool Intersects(Segment2D segment, RectangleF rectangle)
        {
            return(Segment2D.Intersects(segment, rectangle.LeftSegment) ||
                   Segment2D.Intersects(segment, rectangle.TopSegment) ||
                   Segment2D.Intersects(segment, rectangle.RightSegment) ||
                   Segment2D.Intersects(segment, rectangle.BottomSegment) ||
                   (rectangle.Contains(segment.Start) && rectangle.Contains(segment.End)));

            float minX = Math.Min(segment.Start.X, segment.End.X);
            float maxX = Math.Max(segment.Start.X, segment.End.X);

            if (maxX > rectangle.Right)
            {
                maxX = rectangle.Right;
            }

            if (minX < rectangle.Left)
            {
                minX = rectangle.Left;
            }

            if (minX > maxX)
            {
                return(false);
            }

            float minY = Math.Min(segment.Start.Y, segment.End.Y);
            float maxY = Math.Max(segment.Start.Y, segment.End.Y);

            float dx = segment.End.X - segment.Start.X;

            if (Math.Abs(dx) > 0.0000001f)
            {
                float a = (segment.End.Y - segment.Start.Y) / dx;
                float b = segment.Start.Y - a * segment.Start.X;
                minY = a * minX + b;
                maxY = a * maxX + b;
            }

            if (minY > maxY)
            {
                float tmp = maxY;
                maxY = minY;
                minY = tmp;
            }

            if (maxY > rectangle.Bottom)
            {
                maxY = rectangle.Bottom;
            }

            if (minY < rectangle.Top)
            {
                minY = rectangle.Top;
            }

            if (minY > maxY)
            {
                return(false);
            }

            return(true);
        }
Beispiel #5
0
 public static bool Intersects(Vector2f p1, Vector2f p2, Vector2f p3, Vector2f p4, out Vector2f intersectionPoint)
 {
     return(Segment2D.Intersects(new Segment2D(p1, p2), new Segment2D(p3, p4), out intersectionPoint));
 }