diff --git a/Engine.Physics2D/Primitives/Circle.cs b/Engine.Physics2D/Primitives/Circle.cs index dd39b9f..071dce2 100644 --- a/Engine.Physics2D/Primitives/Circle.cs +++ b/Engine.Physics2D/Primitives/Circle.cs @@ -13,6 +13,12 @@ public record Circle(Vector2D Center, float 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); @@ -27,6 +33,8 @@ public static class CircleExtensions 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); diff --git a/Engine.Physics2D/Primitives/Shape.cs b/Engine.Physics2D/Primitives/Shape.cs index 6b74d49..5dbc804 100644 --- a/Engine.Physics2D/Primitives/Shape.cs +++ b/Engine.Physics2D/Primitives/Shape.cs @@ -53,6 +53,30 @@ public record Shape(IList Vertices) : IEnumerable return lines; } + public static void Project(Shape shape, Vector2D projectionVector, IList list) + { + list.Clear(); + + int count = shape.Vertices.Count; + for (int i = 0; i < count; i++) + list.Add(projectionVector.Dot(shape[i])); + } + + public static Projection Project(Shape shape, Vector2D projectionVector) + { + float min = float.MaxValue; + float max = float.MinValue; + + foreach (var vertex in shape) + { + float projectedLength = projectionVector.Dot(vertex); + min = Math.Min(projectedLength, min); + max = Math.Max(projectedLength, max); + } + + return new(min, max); + } + public static Shape TransformShape(Shape shape, ITransform transform) { List vertices = new(shape.Vertices.Count); @@ -96,6 +120,9 @@ public static class ShapeExtensions public static void ToLines(this Shape shape, IList lines) => Shape.GetLines(shape, lines); public static List ToLines(this Shape shape) => Shape.GetLines(shape); + public static void ToProjection(this Shape shape, Vector2D projectionVector, IList list) => Shape.Project(shape, projectionVector, list); + public static Projection ToProjection(this Shape shape, Vector2D projectionVector) => Shape.Project(shape, projectionVector); + public static Shape TransformShape(this ITransform transform, Shape shape) => Shape.TransformShape(shape, transform); public static void TransformShape(this ITransform transform, Shape from, ref Shape to) => Shape.TransformShape(from, transform, ref to);