diff --git a/Engine.Physics2D/Primitives/Shape.cs b/Engine.Physics2D/Primitives/Shape.cs index 8ba8dbf..1091856 100644 --- a/Engine.Physics2D/Primitives/Shape.cs +++ b/Engine.Physics2D/Primitives/Shape.cs @@ -7,62 +7,65 @@ namespace Syntriax.Engine.Physics2D.Primitives; public record Shape(IList Vertices) { - public Triangle SuperTriangle + public static Triangle GetSuperTriangle(Shape shape) { - get + float minX = float.MaxValue, minY = float.MaxValue; + float maxX = float.MinValue, maxY = float.MinValue; + + foreach (Vector2D point in shape.Vertices) { - float minX = float.MaxValue, minY = float.MaxValue; - float maxX = float.MinValue, maxY = float.MinValue; - - foreach (Vector2D point in Vertices) - { - minX = MathF.Min(minX, point.X); - minY = MathF.Min(minY, point.Y); - maxX = MathF.Max(maxX, point.X); - maxY = MathF.Max(maxY, point.Y); - } - - float dx = maxX - minX; - float dy = maxY - minY; - float deltaMax = MathF.Max(dx, dy); - float midX = (minX + maxX) / 2; - float midY = (minY + maxY) / 2; - - Vector2D p1 = new Vector2D((float)midX - 20f * (float)deltaMax, (float)midY - (float)deltaMax); - Vector2D p2 = new Vector2D((float)midX, (float)midY + 20 * (float)deltaMax); - Vector2D p3 = new Vector2D((float)midX + 20 * (float)deltaMax, (float)midY - (float)deltaMax); - - return new Triangle(p1, p2, p3); + minX = MathF.Min(minX, point.X); + minY = MathF.Min(minY, point.Y); + maxX = MathF.Max(maxX, point.X); + maxY = MathF.Max(maxY, point.Y); } + + float dx = maxX - minX; + float dy = maxY - minY; + float deltaMax = MathF.Max(dx, dy); + float midX = (minX + maxX) / 2; + float midY = (minY + maxY) / 2; + + Vector2D p1 = new((float)midX - 20f * (float)deltaMax, (float)midY - (float)deltaMax); + Vector2D p2 = new((float)midX, (float)midY + 20 * (float)deltaMax); + Vector2D p3 = new((float)midX + 20 * (float)deltaMax, (float)midY - (float)deltaMax); + + return new Triangle(p1, p2, p3); } - public List Lines - { - get - { - List lines = new List(Vertices.Count - 1); - GetLinesNonAlloc(lines); - return lines; - } - } - - public void GetLinesNonAlloc(IList lines) + public static void GetLines(Shape shape, IList lines) { lines.Clear(); - for (int i = 0; i < Vertices.Count - 1; i++) - lines.Add(new(Vertices[i], Vertices[i + 1])); - lines.Add(new(Vertices[^1], Vertices[0])); + for (int i = 0; i < shape.Vertices.Count - 1; i++) + lines.Add(new(shape.Vertices[i], shape.Vertices[i + 1])); + lines.Add(new(shape.Vertices[^1], shape.Vertices[0])); } - public bool ApproximatelyEquals(Shape other) + public static List GetLines(Shape shape) { - if (Vertices.Count != other.Vertices.Count) + List lines = new(shape.Vertices.Count - 1); + GetLines(shape, lines); + return lines; + } + + public static bool ApproximatelyEquals(Shape left, Shape right) + { + if (left.Vertices.Count != right.Vertices.Count) return false; - for (int i = 0; i < Vertices.Count; i++) - if (!Vertices[i].ApproximatelyEquals(other.Vertices[i])) + for (int i = 0; i < left.Vertices.Count; i++) + if (!left.Vertices[i].ApproximatelyEquals(right.Vertices[i])) return false; return true; } } + +public static class ShapeExtensions +{ + public static Triangle ToSuperTriangle(this Shape shape) => Shape.GetSuperTriangle(shape); + 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 bool ApproximatelyEquals(this Shape left, Shape right) => Shape.ApproximatelyEquals(left, right); +}