Exemple #1
0
        public static float MinimumDistance(Segment2D segment, Vector2f point)
        {
            Vector2f minimumDistancePoint;

            return(Segment2D.MinimumDistance(segment, point, out minimumDistancePoint));
        }
Exemple #2
0
        public static bool Intersects(Segment2D segment1, Segment2D segment2, out Vector2f intersectionPoint)
        {
            /*  const float Epsilon = 0.00001f;
             *
             * Vector2 cmp = new Vector2(segment2.Start.X - segment1.Start.X, segment2.Start.Y - segment1.Start.Y);
             * Vector2 rectangle = new Vector2(segment1.End.X - segment1.Start.X, segment1.End.Y - segment1.Start.Y);
             * Vector2 s = new Vector2(segment2.End.X - segment2.Start.X, segment2.End.Y - segment2.Start.Y);
             *
             * float cmPxR = cmp.X * rectangle.Y - cmp.Y * rectangle.X;
             * float cmPxS = cmp.X * s.Y - cmp.Y * s.X;
             * float RxS = rectangle.X * s.Y - rectangle.Y * s.X;
             *
             * if (Math.Abs(cmPxR) < Epsilon)
             * {
             *    intersectionPoint = Vector2.Zero;
             *    return true;
             * }
             *
             * if (Math.Abs(RxS) < Epsilon)
             * {
             *    intersectionPoint = default(Vector2);
             *    return false;
             * }
             *
             * float rXsR = 1f / RxS;
             * float t = cmPxS * rXsR;
             * float u = cmPxR * rXsR;
             *
             * if (t >= 0f && t <= 1f && u >= 0f && u <= 1f)
             * {
             *    intersectionPoint = segment1.Start + rectangle * t;
             *    return true;
             * }
             *
             * intersectionPoint = default(Vector2);
             * return false; */

            const float Epsilon = 0.00001f;

            float ua          = (segment2.End.X - segment2.Start.X) * (segment1.Start.Y - segment2.Start.Y) - (segment2.End.Y - segment2.Start.Y) * (segment1.Start.X - segment2.Start.X);
            float ub          = (segment1.End.X - segment1.Start.X) * (segment1.Start.Y - segment2.Start.Y) - (segment1.End.Y - segment1.Start.Y) * (segment1.Start.X - segment2.Start.X);
            float denominator = (segment2.End.Y - segment2.Start.Y) * (segment1.End.X - segment1.Start.X) - (segment2.End.X - segment2.Start.X) * (segment1.End.Y - segment1.Start.Y);

            if (Math.Abs(denominator) <= Epsilon)
            {
                if (Math.Abs(ua) <= Epsilon && Math.Abs(ub) <= Epsilon)
                {
                    intersectionPoint = (segment1.Start + segment1.End + segment2.Start + segment2.End) / 4f;
                    return(true);
                }
            }
            else
            {
                ua /= denominator;
                ub /= denominator;

                if (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1)
                {
                    intersectionPoint = new Vector2f
                    {
                        X = segment1.Start.X + ua * (segment1.End.X - segment1.Start.X),
                        Y = segment1.Start.Y + ua * (segment1.End.Y - segment1.Start.Y)
                    };
                    return(true);
                }
            }

            intersectionPoint = default(Vector2);
            return(false);
        }
Exemple #3
0
 public Segment2D(Vector2f start, Vector2f end)
 {
     this.Start = start;
     this.End   = end;
 }
Exemple #4
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));
 }
Exemple #5
0
 public Segment2D(float startX, float startY, float endX, float endY)
 {
     this.Start = new Vector2(startX, startY);
     this.End   = new Vector2(endX, endY);
 }