public static float MinimumDistance(Segment2D segment, Vector2f point) { Vector2f minimumDistancePoint; return(Segment2D.MinimumDistance(segment, point, out minimumDistancePoint)); }
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); }
public Segment2D(Vector2f start, Vector2f end) { this.Start = start; this.End = end; }
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)); }
public Segment2D(float startX, float startY, float endX, float endY) { this.Start = new Vector2(startX, startY); this.End = new Vector2(endX, endY); }