shape equality optimizations
							parent
							
								
									150f16916e
								
							
						
					
					
						commit
						eefa52c4b3
					
				|  | @ -15,7 +15,7 @@ | ||||||
|     <PackageProjectUrl>https://github.com/MoonsideGames/MoonTools.Core.Bonk</PackageProjectUrl> |     <PackageProjectUrl>https://github.com/MoonsideGames/MoonTools.Core.Bonk</PackageProjectUrl> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <PackageReference Include="MoonTools.Core.Structs" Version="1.0.1"/> |     <PackageReference Include="MoonTools.Core.Structs" Version="1.1.0"/> | ||||||
|     <PackageReference Include="morelinq" Version="3.2.0"/> |     <PackageReference Include="morelinq" Version="3.2.0"/> | ||||||
|     <PackageReference Include="Collections.Pooled" Version="1.0.82"/> |     <PackageReference Include="Collections.Pooled" Version="1.0.82"/> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|  |  | ||||||
|  | @ -1,4 +1,5 @@ | ||||||
| using System; | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
| using Microsoft.Xna.Framework; | using Microsoft.Xna.Framework; | ||||||
| using MoonTools.Core.Structs; | using MoonTools.Core.Structs; | ||||||
| 
 | 
 | ||||||
|  | @ -22,18 +23,48 @@ namespace MoonTools.Core.Bonk | ||||||
|             this.transformB = transformB; |             this.transformB = transformB; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public bool Equals(MinkowskiDifference other) |  | ||||||
|         { |  | ||||||
|             return |  | ||||||
|                 shapeA == other.shapeA && |  | ||||||
|                 transformA.Equals(other.transformA) && |  | ||||||
|                 shapeB == other.shapeB && |  | ||||||
|                 transformB.Equals(other.transformB); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public Vector2 Support(Vector2 direction) |         public Vector2 Support(Vector2 direction) | ||||||
|         { |         { | ||||||
|             return shapeA.Support(direction, transformA) - shapeB.Support(-direction, transformB); |             return shapeA.Support(direction, transformA) - shapeB.Support(-direction, transformB); | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         public override bool Equals(object other) | ||||||
|  |         { | ||||||
|  |             if (other is MinkowskiDifference otherMinkowskiDifference) | ||||||
|  |             { | ||||||
|  |                 return Equals(otherMinkowskiDifference); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public bool Equals(MinkowskiDifference other) | ||||||
|  |         { | ||||||
|  |             return | ||||||
|  |                 shapeA == other.shapeA && | ||||||
|  |                 transformA == other.transformA && | ||||||
|  |                 shapeB == other.shapeB && | ||||||
|  |                 transformB == other.transformB; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public override int GetHashCode() | ||||||
|  |         { | ||||||
|  |             var hashCode = 974363698; | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<IShape2D>.Default.GetHashCode(shapeA); | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<Transform2D>.Default.GetHashCode(transformA); | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<IShape2D>.Default.GetHashCode(shapeB); | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<Transform2D>.Default.GetHashCode(transformB); | ||||||
|  |             return hashCode; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator ==(MinkowskiDifference a, MinkowskiDifference b) | ||||||
|  |         { | ||||||
|  |             return a.Equals(b); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator !=(MinkowskiDifference a, MinkowskiDifference b) | ||||||
|  |         { | ||||||
|  |             return !(a == b); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -31,6 +31,16 @@ namespace MoonTools.Core.Bonk | ||||||
|             ); |             ); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         public override bool Equals(object obj) | ||||||
|  |         { | ||||||
|  |             if (obj is Circle other) | ||||||
|  |             { | ||||||
|  |                 return Equals(other); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         public bool Equals(IShape2D other) |         public bool Equals(IShape2D other) | ||||||
|         { |         { | ||||||
|             if (other is Circle circle) |             if (other is Circle circle) | ||||||
|  | @ -40,5 +50,20 @@ namespace MoonTools.Core.Bonk | ||||||
| 
 | 
 | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         public override int GetHashCode() | ||||||
|  |         { | ||||||
|  |             return 598075851 + Radius.GetHashCode(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator ==(Circle a, Circle b) | ||||||
|  |         { | ||||||
|  |             return a.Equals(b); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator !=(Circle a, Circle b) | ||||||
|  |         { | ||||||
|  |             return !(a == b); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -42,15 +42,43 @@ namespace MoonTools.Core.Bonk | ||||||
|             return Bonk.AABB.FromTransformedVertices(vertices, Transform2D); |             return Bonk.AABB.FromTransformedVertices(vertices, Transform2D); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public bool Equals(IShape2D other) |         public override bool Equals(object obj) | ||||||
|         { |         { | ||||||
|             if (other is Line) |             if (obj is IShape2D other) | ||||||
|             { |             { | ||||||
|                 var otherLine = (Line)other; |                 return Equals(other); | ||||||
|                 return v0.ToVector2() == otherLine.v0.ToVector2() && v1.ToVector2() == otherLine.v1.ToVector2(); |  | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         public bool Equals(IShape2D other) | ||||||
|  |         { | ||||||
|  |             if (other is Line otherLine) | ||||||
|  |             { | ||||||
|  |                 return (v0 == otherLine.v0 && v1 == otherLine.v1) || (v1 == otherLine.v0 && v0 == otherLine.v1); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public override int GetHashCode() | ||||||
|  |         { | ||||||
|  |             var hashCode = -851829407; | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<Position2D>.Default.GetHashCode(v0); | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<Position2D>.Default.GetHashCode(v1); | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<IEnumerable<Position2D>>.Default.GetHashCode(vertices); | ||||||
|  |             return hashCode; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator ==(Line a, Line b) | ||||||
|  |         { | ||||||
|  |             return a.Equals(b); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator !=(Line a, Line b) | ||||||
|  |         { | ||||||
|  |             return !(a == b); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,6 +1,10 @@ | ||||||
| using System; | using System.Linq; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using Collections.Pooled; | ||||||
| using Microsoft.Xna.Framework; | using Microsoft.Xna.Framework; | ||||||
| using MoonTools.Core.Structs; | using MoonTools.Core.Structs; | ||||||
|  | using MoreLinq; | ||||||
| 
 | 
 | ||||||
| namespace MoonTools.Core.Bonk | namespace MoonTools.Core.Bonk | ||||||
| { | { | ||||||
|  | @ -9,31 +13,19 @@ namespace MoonTools.Core.Bonk | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public struct Polygon : IShape2D, IEquatable<IShape2D> |     public struct Polygon : IShape2D, IEquatable<IShape2D> | ||||||
|     { |     { | ||||||
|         public Position2D[] Vertices { get; private set; } |         private PooledSet<Position2D> vertices; | ||||||
|  | 
 | ||||||
|  |         public IEnumerable<Position2D> Vertices { get { return vertices == null ? Enumerable.Empty<Position2D>() : vertices; } } | ||||||
| 
 | 
 | ||||||
|         // vertices are local to the origin |         // vertices are local to the origin | ||||||
|         public Polygon(params Position2D[] vertices) |         public Polygon(params Position2D[] vertices) | ||||||
|         { |         { | ||||||
|             Vertices = vertices; |             this.vertices = new PooledSet<Position2D>(vertices, ClearMode.Always); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public Vector2 Support(Vector2 direction, Transform2D transform) |         public Vector2 Support(Vector2 direction, Transform2D transform) | ||||||
|         { |         { | ||||||
|             var furthest = float.NegativeInfinity; |             return Vertices.Select(vertex => Vector2.Transform(vertex, transform.TransformMatrix)).MaxBy(transformed => Vector2.Dot(transformed, direction)).First(); | ||||||
|             var furthestVertex = Vector2.Transform(Vertices[0], transform.TransformMatrix); |  | ||||||
| 
 |  | ||||||
|             foreach (var vertex in Vertices) |  | ||||||
|             { |  | ||||||
|                 var TransformedVertex = Vector2.Transform(vertex, transform.TransformMatrix); |  | ||||||
|                 var distance = Vector2.Dot(TransformedVertex, direction); |  | ||||||
|                 if (distance > furthest) |  | ||||||
|                 { |  | ||||||
|                     furthest = distance; |  | ||||||
|                     furthestVertex = TransformedVertex; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             return furthestVertex; |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public AABB AABB(Transform2D Transform2D) |         public AABB AABB(Transform2D Transform2D) | ||||||
|  | @ -41,23 +33,42 @@ namespace MoonTools.Core.Bonk | ||||||
|             return Bonk.AABB.FromTransformedVertices(Vertices, Transform2D); |             return Bonk.AABB.FromTransformedVertices(Vertices, Transform2D); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public bool Equals(IShape2D other) |         public override bool Equals(object obj) | ||||||
|         { |         { | ||||||
|             if (other is Polygon) |             if (obj is IShape2D other) | ||||||
|             { |             { | ||||||
|                 var otherPolygon = (Polygon)other; |                 return Equals(other); | ||||||
| 
 |  | ||||||
|                 if (Vertices.Length != otherPolygon.Vertices.Length) { return false; } |  | ||||||
| 
 |  | ||||||
|                 for (int i = 0; i < Vertices.Length; i++) |  | ||||||
|                 { |  | ||||||
|                     if (Vertices[i].ToVector2() != otherPolygon.Vertices[i].ToVector2()) { return false; } |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 return true; |  | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         public bool Equals(IShape2D other) | ||||||
|  |         { | ||||||
|  |             if (other is Polygon otherPolygon) | ||||||
|  |             { | ||||||
|  |                 return vertices.SetEquals(otherPolygon.vertices); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public override int GetHashCode() | ||||||
|  |         { | ||||||
|  |             var hashCode = -1404792980; | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<PooledSet<Position2D>>.Default.GetHashCode(vertices); | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<IEnumerable<Position2D>>.Default.GetHashCode(Vertices); | ||||||
|  |             return hashCode; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator ==(Polygon a, Polygon b) | ||||||
|  |         { | ||||||
|  |             return a.Equals(b); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator !=(Polygon a, Polygon b) | ||||||
|  |         { | ||||||
|  |             return !(a == b); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -46,6 +46,16 @@ namespace MoonTools.Core.Bonk | ||||||
|             return Bonk.AABB.FromTransformedVertices(vertices, Transform2D); |             return Bonk.AABB.FromTransformedVertices(vertices, Transform2D); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         public override bool Equals(object obj) | ||||||
|  |         { | ||||||
|  |             if (obj is IShape2D other) | ||||||
|  |             { | ||||||
|  |                 return Equals(other); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         public bool Equals(IShape2D other) |         public bool Equals(IShape2D other) | ||||||
|         { |         { | ||||||
|             if (other is Rectangle rectangle) |             if (other is Rectangle rectangle) | ||||||
|  | @ -58,5 +68,26 @@ namespace MoonTools.Core.Bonk | ||||||
| 
 | 
 | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         public override int GetHashCode() | ||||||
|  |         { | ||||||
|  |             var hashCode = -1260800952; | ||||||
|  |             hashCode = hashCode * -1521134295 + MinX.GetHashCode(); | ||||||
|  |             hashCode = hashCode * -1521134295 + MinY.GetHashCode(); | ||||||
|  |             hashCode = hashCode * -1521134295 + MaxX.GetHashCode(); | ||||||
|  |             hashCode = hashCode * -1521134295 + MaxY.GetHashCode(); | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<IEnumerable<Position2D>>.Default.GetHashCode(vertices); | ||||||
|  |             return hashCode; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator ==(Rectangle a, Rectangle b) | ||||||
|  |         { | ||||||
|  |             return a.Equals(b); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator !=(Rectangle a, Rectangle b) | ||||||
|  |         { | ||||||
|  |             return !(a == b); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -44,18 +44,6 @@ namespace MoonTools.Core.Bonk | ||||||
|             return Bonk.AABB.FromTransformedVertices(Vertices, transform); |             return Bonk.AABB.FromTransformedVertices(Vertices, transform); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public bool Equals(IShape2D other) |  | ||||||
|         { |  | ||||||
|             if (other is Simplex polytope) |  | ||||||
|             { |  | ||||||
|                 return minkowskiDifference.Equals(polytope.minkowskiDifference) && |  | ||||||
|                     directionA == polytope.directionA && |  | ||||||
|                     directionB == polytope.directionB; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public Vector2 Support(Vector2 direction) |         public Vector2 Support(Vector2 direction) | ||||||
|         { |         { | ||||||
|             return minkowskiDifference.Support(direction); |             return minkowskiDifference.Support(direction); | ||||||
|  | @ -65,5 +53,49 @@ namespace MoonTools.Core.Bonk | ||||||
|         { |         { | ||||||
|             return Vector2.Transform(Support(direction), transform.TransformMatrix); |             return Vector2.Transform(Support(direction), transform.TransformMatrix); | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         public override bool Equals(object obj) | ||||||
|  |         { | ||||||
|  |             if (obj is IShape2D other) | ||||||
|  |             { | ||||||
|  |                 return Equals(other); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public bool Equals(IShape2D other) | ||||||
|  |         { | ||||||
|  |             if (other is Simplex otherSimplex) | ||||||
|  |             { | ||||||
|  |                 return minkowskiDifference == otherSimplex.minkowskiDifference && | ||||||
|  |                     ((directionA == otherSimplex.directionA && directionB == otherSimplex.directionB) || | ||||||
|  |                     (directionA == otherSimplex.directionB && directionB == otherSimplex.directionA)); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public override int GetHashCode() | ||||||
|  |         { | ||||||
|  |             var hashCode = 74270316; | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<MinkowskiDifference>.Default.GetHashCode(minkowskiDifference); | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<Vector2>.Default.GetHashCode(directionA); | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<Vector2>.Default.GetHashCode(directionB); | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<Vector2>.Default.GetHashCode(DirectionA); | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<Vector2>.Default.GetHashCode(DirectionB); | ||||||
|  |             hashCode = hashCode * -1521134295 + EqualityComparer<IEnumerable<Position2D>>.Default.GetHashCode(Vertices); | ||||||
|  |             return hashCode; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator ==(Simplex a, Simplex b) | ||||||
|  |         { | ||||||
|  |             return a.Equals(b); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator !=(Simplex a, Simplex b) | ||||||
|  |         { | ||||||
|  |             return !(a == b); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -0,0 +1,427 @@ | ||||||
|  | using NUnit.Framework; | ||||||
|  | using FluentAssertions; | ||||||
|  | 
 | ||||||
|  | using MoonTools.Core.Bonk; | ||||||
|  | using MoonTools.Core.Structs; | ||||||
|  | using Microsoft.Xna.Framework; | ||||||
|  | 
 | ||||||
|  | namespace Tests | ||||||
|  | { | ||||||
|  |     public class EqualityTests | ||||||
|  |     { | ||||||
|  |         public class CircleTests | ||||||
|  |         { | ||||||
|  |             [Test] | ||||||
|  |             public void CircleEqual() | ||||||
|  |             { | ||||||
|  |                 var a = new Circle(2); | ||||||
|  |                 var b = new Circle(2); | ||||||
|  | 
 | ||||||
|  |                 (a.Equals(b)).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void CircleNotEqual() | ||||||
|  |             { | ||||||
|  |                 var a = new Circle(2); | ||||||
|  |                 var b = new Circle(3); | ||||||
|  | 
 | ||||||
|  |                 (a.Equals(b)).Should().BeFalse(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void CircleEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var a = new Circle(2); | ||||||
|  |                 var b = new Circle(2); | ||||||
|  | 
 | ||||||
|  |                 (a == b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void CircleNotEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var a = new Circle(2); | ||||||
|  |                 var b = new Circle(3); | ||||||
|  | 
 | ||||||
|  |                 (a != b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public class LineTests | ||||||
|  |         { | ||||||
|  |             [Test] | ||||||
|  |             public void LineEqual() | ||||||
|  |             { | ||||||
|  |                 var a = new Line(new Position2D(0, 2), new Position2D(2, 4)); | ||||||
|  |                 var b = new Line(new Position2D(0, 2), new Position2D(2, 4)); | ||||||
|  | 
 | ||||||
|  |                 a.Equals(b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void LineEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var a = new Line(new Position2D(0, 2), new Position2D(2, 4)); | ||||||
|  |                 var b = new Line(new Position2D(0, 2), new Position2D(2, 4)); | ||||||
|  | 
 | ||||||
|  |                 (a == b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void LineNotEqual() | ||||||
|  |             { | ||||||
|  |                 var a = new Line(new Position2D(-2, 4), new Position2D(2, 4)); | ||||||
|  |                 var b = new Line(new Position2D(0, 3), new Position2D(5, 1)); | ||||||
|  | 
 | ||||||
|  |                 a.Equals(b).Should().BeFalse(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void LineNotEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var a = new Line(new Position2D(-2, 4), new Position2D(2, 4)); | ||||||
|  |                 var b = new Line(new Position2D(0, 3), new Position2D(5, 1)); | ||||||
|  | 
 | ||||||
|  |                 (a != b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void LineReversedEqual() | ||||||
|  |             { | ||||||
|  |                 var a = new Line(new Position2D(0, 2), new Position2D(2, 4)); | ||||||
|  |                 var b = new Line(new Position2D(2, 4), new Position2D(0, 2)); | ||||||
|  | 
 | ||||||
|  |                 a.Equals(b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void LineReversedEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var a = new Line(new Position2D(0, 2), new Position2D(2, 4)); | ||||||
|  |                 var b = new Line(new Position2D(2, 4), new Position2D(0, 2)); | ||||||
|  | 
 | ||||||
|  |                 (a == b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public class RectangleTests | ||||||
|  |         { | ||||||
|  |             [Test] | ||||||
|  |             public void RectangleEqual() | ||||||
|  |             { | ||||||
|  |                 var a = new MoonTools.Core.Bonk.Rectangle(0, 0, 3, 3); | ||||||
|  |                 var b = new MoonTools.Core.Bonk.Rectangle(0, 0, 3, 3); | ||||||
|  | 
 | ||||||
|  |                 a.Equals(b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void RectangleEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var a = new MoonTools.Core.Bonk.Rectangle(0, 0, 3, 3); | ||||||
|  |                 var b = new MoonTools.Core.Bonk.Rectangle(0, 0, 3, 3); | ||||||
|  | 
 | ||||||
|  |                 (a == b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void RectangleNotEqual() | ||||||
|  |             { | ||||||
|  |                 var a = new MoonTools.Core.Bonk.Rectangle(0, 0, 3, 3); | ||||||
|  |                 var b = new MoonTools.Core.Bonk.Rectangle(-1, -1, 5, 5); | ||||||
|  | 
 | ||||||
|  |                 a.Equals(b).Should().BeFalse(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void RectangleNotEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var a = new MoonTools.Core.Bonk.Rectangle(0, 0, 3, 3); | ||||||
|  |                 var b = new MoonTools.Core.Bonk.Rectangle(-1, -1, 5, 5); | ||||||
|  | 
 | ||||||
|  |                 (a != b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public class PolygonTests | ||||||
|  |         { | ||||||
|  |             [Test] | ||||||
|  |             public void PolygonEqual() | ||||||
|  |             { | ||||||
|  |                 var a = new Polygon( | ||||||
|  |                     new Position2D(0, 1), | ||||||
|  |                     new Position2D(1, 2), | ||||||
|  |                     new Position2D(-1, -1) | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 var b = new Polygon( | ||||||
|  |                     new Position2D(0, 1), | ||||||
|  |                     new Position2D(1, 2), | ||||||
|  |                     new Position2D(-1, -1) | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 a.Equals(b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void PolygonEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var a = new Polygon( | ||||||
|  |                     new Position2D(0, 1), | ||||||
|  |                     new Position2D(1, 2), | ||||||
|  |                     new Position2D(-1, -1) | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 var b = new Polygon( | ||||||
|  |                     new Position2D(0, 1), | ||||||
|  |                     new Position2D(1, 2), | ||||||
|  |                     new Position2D(-1, -1) | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 (a == b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void PolygonDifferentOrderEqual() | ||||||
|  |             { | ||||||
|  |                 var a = new Polygon( | ||||||
|  |                     new Position2D(0, 1), | ||||||
|  |                     new Position2D(1, 2), | ||||||
|  |                     new Position2D(-1, -1) | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 var b = new Polygon( | ||||||
|  |                     new Position2D(1, 2), | ||||||
|  |                     new Position2D(-1, -1), | ||||||
|  |                     new Position2D(0, 1) | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 a.Equals(b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void PolygonDifferentOrderEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var a = new Polygon( | ||||||
|  |                     new Position2D(0, 1), | ||||||
|  |                     new Position2D(1, 2), | ||||||
|  |                     new Position2D(-1, -1) | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 var b = new Polygon( | ||||||
|  |                     new Position2D(1, 2), | ||||||
|  |                     new Position2D(-1, -1), | ||||||
|  |                     new Position2D(0, 1) | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 (a == b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void PolygonNotEqual() | ||||||
|  |             { | ||||||
|  |                 var a = new Polygon( | ||||||
|  |                     new Position2D(0, 1), | ||||||
|  |                     new Position2D(1, 2), | ||||||
|  |                     new Position2D(-1, -1) | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 var b = new Polygon( | ||||||
|  |                     new Position2D(1, 0), | ||||||
|  |                     new Position2D(2, 1), | ||||||
|  |                     new Position2D(-1, -1) | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 a.Equals(b).Should().BeFalse(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void PolygonNotEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var a = new Polygon( | ||||||
|  |                     new Position2D(0, 1), | ||||||
|  |                     new Position2D(1, 2), | ||||||
|  |                     new Position2D(-1, -1) | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 var b = new Polygon( | ||||||
|  |                     new Position2D(1, 0), | ||||||
|  |                     new Position2D(2, 1), | ||||||
|  |                     new Position2D(-1, -1) | ||||||
|  |                 ); | ||||||
|  | 
 | ||||||
|  |                 (a != b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public class SimplexTests | ||||||
|  |         { | ||||||
|  |             [Test] | ||||||
|  |             public void SimplexEquals() | ||||||
|  |             { | ||||||
|  |                 var shapeA = new Circle(3); | ||||||
|  |                 var transformA = new Transform2D(new Position2D(1, 2)); | ||||||
|  | 
 | ||||||
|  |                 var shapeB = new Circle(2); | ||||||
|  |                 var transformB = new Transform2D(new Position2D(4, 5)); | ||||||
|  | 
 | ||||||
|  |                 var minkowskiDifference = new MinkowskiDifference(shapeA, transformA, shapeB, transformB); | ||||||
|  | 
 | ||||||
|  |                 var directionA = Vector2.UnitX; | ||||||
|  |                 var directionB = Vector2.UnitY; | ||||||
|  | 
 | ||||||
|  |                 var simplexA = new Simplex(minkowskiDifference, directionA, directionB); | ||||||
|  |                 var simplexB = new Simplex(minkowskiDifference, directionA, directionB); | ||||||
|  | 
 | ||||||
|  |                 simplexA.Equals(simplexB).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void SimplexEqualsOperator() | ||||||
|  |             { | ||||||
|  |                 var shapeA = new Circle(3); | ||||||
|  |                 var transformA = new Transform2D(new Position2D(1, 2)); | ||||||
|  | 
 | ||||||
|  |                 var shapeB = new Circle(2); | ||||||
|  |                 var transformB = new Transform2D(new Position2D(4, 5)); | ||||||
|  | 
 | ||||||
|  |                 var minkowskiDifference = new MinkowskiDifference(shapeA, transformA, shapeB, transformB); | ||||||
|  | 
 | ||||||
|  |                 var directionA = Vector2.UnitX; | ||||||
|  |                 var directionB = Vector2.UnitY; | ||||||
|  | 
 | ||||||
|  |                 var simplexA = new Simplex(minkowskiDifference, directionA, directionB); | ||||||
|  |                 var simplexB = new Simplex(minkowskiDifference, directionA, directionB); | ||||||
|  | 
 | ||||||
|  |                 (simplexA == simplexB).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void SimplexDirectionOutOfOrderEqual() | ||||||
|  |             { | ||||||
|  |                 var shapeA = new Circle(3); | ||||||
|  |                 var transformA = new Transform2D(new Position2D(1, 2)); | ||||||
|  | 
 | ||||||
|  |                 var shapeB = new Circle(2); | ||||||
|  |                 var transformB = new Transform2D(new Position2D(4, 5)); | ||||||
|  | 
 | ||||||
|  |                 var minkowskiDifference = new MinkowskiDifference(shapeA, transformA, shapeB, transformB); | ||||||
|  | 
 | ||||||
|  |                 var directionA = Vector2.UnitX; | ||||||
|  |                 var directionB = Vector2.UnitY; | ||||||
|  | 
 | ||||||
|  |                 var simplexA = new Simplex(minkowskiDifference, directionA, directionB); | ||||||
|  |                 var simplexB = new Simplex(minkowskiDifference, directionB, directionA); | ||||||
|  | 
 | ||||||
|  |                 simplexA.Equals(simplexB).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void SimplexDirectionOutOfOrderEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var shapeA = new Circle(3); | ||||||
|  |                 var transformA = new Transform2D(new Position2D(1, 2)); | ||||||
|  | 
 | ||||||
|  |                 var shapeB = new Circle(2); | ||||||
|  |                 var transformB = new Transform2D(new Position2D(4, 5)); | ||||||
|  | 
 | ||||||
|  |                 var minkowskiDifference = new MinkowskiDifference(shapeA, transformA, shapeB, transformB); | ||||||
|  | 
 | ||||||
|  |                 var directionA = Vector2.UnitX; | ||||||
|  |                 var directionB = Vector2.UnitY; | ||||||
|  | 
 | ||||||
|  |                 var simplexA = new Simplex(minkowskiDifference, directionA, directionB); | ||||||
|  |                 var simplexB = new Simplex(minkowskiDifference, directionB, directionA); | ||||||
|  | 
 | ||||||
|  |                 (simplexA == simplexB).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void SimplexMinkowskiNotEqual() | ||||||
|  |             { | ||||||
|  |                 var shapeA = new Circle(3); | ||||||
|  |                 var transformA = new Transform2D(new Position2D(1, 2)); | ||||||
|  | 
 | ||||||
|  |                 var shapeB = new Circle(2); | ||||||
|  |                 var transformB = new Transform2D(new Position2D(4, 5)); | ||||||
|  | 
 | ||||||
|  |                 var minkowskiDifferenceA = new MinkowskiDifference(shapeA, transformA, shapeB, transformB); | ||||||
|  |                 var minkowskiDifferenceB = new MinkowskiDifference(shapeB, transformB, shapeA, transformA); | ||||||
|  | 
 | ||||||
|  |                 var directionA = Vector2.UnitX; | ||||||
|  |                 var directionB = Vector2.UnitY; | ||||||
|  | 
 | ||||||
|  |                 var simplexA = new Simplex(minkowskiDifferenceA, directionA, directionB); | ||||||
|  |                 var simplexB = new Simplex(minkowskiDifferenceB, directionA, directionB); | ||||||
|  | 
 | ||||||
|  |                 simplexA.Equals(simplexB).Should().BeFalse(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void SimplexMinkowskiNotEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var shapeA = new Circle(3); | ||||||
|  |                 var transformA = new Transform2D(new Position2D(1, 2)); | ||||||
|  | 
 | ||||||
|  |                 var shapeB = new Circle(2); | ||||||
|  |                 var transformB = new Transform2D(new Position2D(4, 5)); | ||||||
|  | 
 | ||||||
|  |                 var minkowskiDifferenceA = new MinkowskiDifference(shapeA, transformA, shapeB, transformB); | ||||||
|  |                 var minkowskiDifferenceB = new MinkowskiDifference(shapeB, transformB, shapeA, transformA); | ||||||
|  | 
 | ||||||
|  |                 var directionA = Vector2.UnitX; | ||||||
|  |                 var directionB = Vector2.UnitY; | ||||||
|  | 
 | ||||||
|  |                 var simplexA = new Simplex(minkowskiDifferenceA, directionA, directionB); | ||||||
|  |                 var simplexB = new Simplex(minkowskiDifferenceB, directionA, directionB); | ||||||
|  | 
 | ||||||
|  |                 (simplexA != simplexB).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void SimplexDirectionsNotEqual() | ||||||
|  |             { | ||||||
|  |                 var shapeA = new Circle(3); | ||||||
|  |                 var transformA = new Transform2D(new Position2D(1, 2)); | ||||||
|  | 
 | ||||||
|  |                 var shapeB = new Circle(2); | ||||||
|  |                 var transformB = new Transform2D(new Position2D(4, 5)); | ||||||
|  | 
 | ||||||
|  |                 var minkowskiDifference = new MinkowskiDifference(shapeA, transformA, shapeB, transformB); | ||||||
|  | 
 | ||||||
|  |                 var directionA = Vector2.UnitX; | ||||||
|  |                 var directionB = Vector2.UnitY; | ||||||
|  |                 var directionC = -Vector2.UnitX; | ||||||
|  |                 var directionD = -Vector2.UnitY; | ||||||
|  | 
 | ||||||
|  |                 var simplexA = new Simplex(minkowskiDifference, directionA, directionB); | ||||||
|  |                 var simplexB = new Simplex(minkowskiDifference, directionC, directionD); | ||||||
|  | 
 | ||||||
|  |                 simplexA.Equals(simplexB).Should().BeFalse(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void SimplexDirectionsNotEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var shapeA = new Circle(3); | ||||||
|  |                 var transformA = new Transform2D(new Position2D(1, 2)); | ||||||
|  | 
 | ||||||
|  |                 var shapeB = new Circle(2); | ||||||
|  |                 var transformB = new Transform2D(new Position2D(4, 5)); | ||||||
|  | 
 | ||||||
|  |                 var minkowskiDifference = new MinkowskiDifference(shapeA, transformA, shapeB, transformB); | ||||||
|  | 
 | ||||||
|  |                 var directionA = Vector2.UnitX; | ||||||
|  |                 var directionB = Vector2.UnitY; | ||||||
|  |                 var directionC = -Vector2.UnitX; | ||||||
|  |                 var directionD = -Vector2.UnitY; | ||||||
|  | 
 | ||||||
|  |                 var simplexA = new Simplex(minkowskiDifference, directionA, directionB); | ||||||
|  |                 var simplexB = new Simplex(minkowskiDifference, directionC, directionD); | ||||||
|  | 
 | ||||||
|  |                 (simplexA != simplexB).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue