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