diff --git a/Bonk/AABB.cs b/Bonk/AABB.cs index 1f47466..b525cd3 100644 --- a/Bonk/AABB.cs +++ b/Bonk/AABB.cs @@ -68,4 +68,4 @@ namespace MoonTools.Core.Bonk return !(left == right); } } -} \ No newline at end of file +} diff --git a/Bonk/Bonk.csproj b/Bonk/Bonk.csproj index d358848..c90ff86 100644 --- a/Bonk/Bonk.csproj +++ b/Bonk/Bonk.csproj @@ -1,7 +1,7 @@ - + 5.0.1 - netstandard2.1 + netstandard2.0 .NET Core High Performance Collision Detection MoonTools.Core.Bonk MoonTools.Core.Bonk @@ -19,8 +19,9 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + + diff --git a/Bonk/Shapes/Polygon.cs b/Bonk/Shapes/Polygon.cs index 504dcc1..f3aab33 100644 --- a/Bonk/Shapes/Polygon.cs +++ b/Bonk/Shapes/Polygon.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Numerics; using MoonTools.Core.Structs; -using MoreLinq; namespace MoonTools.Core.Bonk { @@ -18,7 +17,7 @@ namespace MoonTools.Core.Bonk public IEnumerable Vertices { get { return vertices; } } - public int VertexCount { get { return vertices.Length; } } + public int VertexCount { get { return vertices.Length; } } // vertices are local to the origin public Polygon(IEnumerable vertices) // TODO: remove this, params is bad because it allocates an array @@ -33,7 +32,19 @@ namespace MoonTools.Core.Bonk public Vector2 Support(Vector2 direction, Transform2D transform) { - return Vertices.Select(vertex => Vector2.Transform(vertex, transform.TransformMatrix)).MaxBy(transformed => Vector2.Dot(transformed, direction)).First(); + var maxDotProduct = float.NegativeInfinity; + var maxVertex = vertices[0].ToVector2(); + foreach (var vertex in Vertices) + { + var transformed = Vector2.Transform(vertex, transform.TransformMatrix); + var dot = Vector2.Dot(transformed, direction); + if (dot > maxDotProduct) + { + maxVertex = transformed; + maxDotProduct = dot; + } + } + return maxVertex; } public AABB AABB(Transform2D Transform2D) diff --git a/Bonk/Shapes/Rectangle.cs b/Bonk/Shapes/Rectangle.cs index 2e04491..a28ca7b 100644 --- a/Bonk/Shapes/Rectangle.cs +++ b/Bonk/Shapes/Rectangle.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; using MoonTools.Core.Structs; -using MoreLinq; namespace MoonTools.Core.Bonk { @@ -38,7 +37,19 @@ namespace MoonTools.Core.Bonk public Vector2 Support(Vector2 direction, Transform2D transform) { - return Vertices.Select(vertex => Vector2.Transform(vertex, transform.TransformMatrix)).MaxBy(transformed => Vector2.Dot(transformed, direction)).First(); + var maxDotProduct = float.NegativeInfinity; + var maxVertex = new Vector2(MinX, MinY); + foreach (var vertex in Vertices) + { + var transformed = Vector2.Transform(vertex, transform.TransformMatrix); + var dot = Vector2.Dot(transformed, direction); + if (dot > maxDotProduct) + { + maxVertex = transformed; + maxDotProduct = dot; + } + } + return maxVertex; } public AABB AABB(Transform2D Transform2D) diff --git a/Bonk/Shapes/Simplex.cs b/Bonk/Shapes/Simplex.cs index 680f488..b504079 100644 --- a/Bonk/Shapes/Simplex.cs +++ b/Bonk/Shapes/Simplex.cs @@ -2,7 +2,6 @@ using System.Linq; using System.Collections.Generic; using System.Numerics; using MoonTools.Core.Structs; -using MoreLinq; using System; namespace MoonTools.Core.Bonk @@ -62,14 +61,21 @@ namespace MoonTools.Core.Bonk return Bonk.AABB.FromTransformedVertices(Vertices, transform); } - public Vector2 Support(Vector2 direction) - { - return Vertices.MaxBy(vertex => Vector2.Dot(vertex, direction)).First(); - } - public Vector2 Support(Vector2 direction, Transform2D transform) { - return Vector2.Transform(Support(direction), transform.TransformMatrix); + var maxDotProduct = float.NegativeInfinity; + var maxVertex = a; + foreach (var vertex in Vertices) + { + var transformed = Vector2.Transform(vertex, transform.TransformMatrix); + var dot = Vector2.Dot(transformed, direction); + if (dot > maxDotProduct) + { + maxVertex = transformed; + maxDotProduct = dot; + } + } + return maxVertex; } public override bool Equals(object obj) @@ -106,4 +112,4 @@ namespace MoonTools.Core.Bonk return !(a == b); } } -} \ No newline at end of file +}