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)); }
// 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))); }
public static bool Intersects(Segment2D segment1, Segment2D segment2) { Vector2f intersectionPoint; return(Segment2D.Intersects(segment1, segment2, out intersectionPoint)); }
// 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); }
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)); }