private static bool CheckOverlap(Arc arc, Circle circle) { vec2 p1 = arc.Position; vec2 p2 = circle.Position; float sumRadius = arc.Radius + circle.Radius; float distanceSquared = Utilities.DistanceSquared(p1, p2); if (distanceSquared > sumRadius * sumRadius) { return(false); } float angle = Utilities.Angle(p1, p2); float delta = Utilities.CorrectAngle(Math.Abs(angle - arc.Angle)); float halfSpread = arc.Spread / 2; if (delta <= halfSpread) { return(true); } vec2[] points = new vec2[2]; for (int i = 0; i < 2; i++) { float a = arc.Angle + halfSpread * (i == 0 ? -1 : 1); points[i] = p1 + Utilities.Direction(a) * arc.Radius; } if (points.Any(circle.Contains)) { return(true); } float radiusSquared = circle.Radius * circle.Radius; return(points.Any(p => Utilities.DistanceSquaredToLine(p2, p1, p) <= radiusSquared)); }
private static bool CheckOverlap(Arc arc, Circle circle) { var p1 = arc.Position; var p2 = circle.Position; var sumRadius = arc.Radius + circle.Radius; var distanceSquared = Utilities.DistanceSquared(p1, p2); if (distanceSquared > sumRadius * sumRadius) { return(false); } var angle = Utilities.Angle(p1, p2); var delta = Utilities.Delta(angle, arc.Angle); var halfSpread = arc.Spread / 2; if (delta <= halfSpread) { return(true); } var points = new vec2[2]; for (int i = 0; i < 2; i++) { var a = arc.Angle + halfSpread * (i == 0 ? -1 : 1); points[i] = p1 + Utilities.Direction(a) * arc.Radius; } if (points.Any(p => circle.Contains(p, Coordinates.Absolute))) { return(true); } var squared = circle.Radius * circle.Radius; return(points.Any(p => Utilities.DistanceSquaredToLine(p2, p1, p, out _) <= squared)); }