using Syntriax.Engine.Core; using Syntriax.Engine.Core.Abstract; namespace Syntriax.Engine.Physics2D.Primitives; [System.Diagnostics.DebuggerDisplay("Center: {Center.ToString(), nq}, Radius: {Radius}")] public readonly struct Circle(Vector2D Center, float Radius) { public static readonly Circle UnitCircle = new(Vector2D.Zero, 1f); public readonly Vector2D Center { get; init; } = Center; public readonly float Radius { get; init; } = Radius; public readonly float RadiusSquared => Radius * Radius; public readonly float Diameter => 2f * Radius; public static Circle SetCenter(Circle circle, Vector2D center) => new(center, circle.Radius); public static Circle SetRadius(Circle circle, float radius) => new(circle.Center, radius); public static Circle Displace(Circle circle, Vector2D displaceVector) => new(circle.Center + displaceVector, circle.Radius); public static Projection Project(Circle circle, Vector2D projectionVector) { float projectedCenter = circle.Center.Dot(projectionVector); return new(projectedCenter - circle.Radius, projectedCenter + circle.Radius); } public static Circle TransformCircle(ITransform transform, Circle circle) => new(transform.TransformVector2D(circle.Center), circle.Radius * transform.Scale.Magnitude); public static bool ApproximatelyEquals(Circle left, Circle right) => left.Center.ApproximatelyEquals(right.Center) && left.Radius.ApproximatelyEquals(right.Radius); } public static class CircleExtensions { public static Circle SetCenter(this Circle circle, Vector2D center) => Circle.SetCenter(circle, center); public static Circle SetRadius(this Circle circle, float radius) => Circle.SetRadius(circle, radius); public static Circle Displace(this Circle circle, Vector2D displaceVector) => Circle.Displace(circle, displaceVector); public static Projection ToProjection(this Circle circle, Vector2D projectionVector) => Circle.Project(circle, projectionVector); public static Circle TransformCircle(this ITransform transform, Circle circle) => Circle.TransformCircle(transform, circle); public static bool ApproximatelyEquals(this Circle left, Circle right) => Circle.ApproximatelyEquals(left, right); }