adds Point shape
							parent
							
								
									1430047327
								
							
						
					
					
						commit
						a4b6e72286
					
				|  | @ -0,0 +1,67 @@ | ||||||
|  | using System; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Numerics; | ||||||
|  | using MoonTools.Core.Structs; | ||||||
|  | 
 | ||||||
|  | namespace MoonTools.Core.Bonk | ||||||
|  | { | ||||||
|  |     public struct Point : IShape2D, IEquatable<IShape2D> | ||||||
|  |     { | ||||||
|  |         private Position2D position; | ||||||
|  | 
 | ||||||
|  |         public Point(Position2D position) | ||||||
|  |         { | ||||||
|  |             this.position = position; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public Point(int x, int y) | ||||||
|  |         { | ||||||
|  |             this.position = new Position2D(x, y); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public AABB AABB(Transform2D transform) | ||||||
|  |         { | ||||||
|  |             return Bonk.AABB.FromTransformedVertices(Enumerable.Repeat<Position2D>(position, 1), transform); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public Vector2 Support(Vector2 direction, Transform2D transform) | ||||||
|  |         { | ||||||
|  |             return position; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public override bool Equals(object obj) | ||||||
|  |         { | ||||||
|  |             if (obj is IShape2D other) | ||||||
|  |             { | ||||||
|  |                 return Equals(other); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public bool Equals(IShape2D other) | ||||||
|  |         { | ||||||
|  |             if (other is Point otherPoint) | ||||||
|  |             { | ||||||
|  |                 return position == otherPoint.position; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public override int GetHashCode() | ||||||
|  |         { | ||||||
|  |             return HashCode.Combine(position); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator ==(Point a, Point b) | ||||||
|  |         { | ||||||
|  |             return a.Equals(b); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public static bool operator !=(Point a, Point b) | ||||||
|  |         { | ||||||
|  |             return !(a == b); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -10,7 +10,7 @@ namespace MoonTools.Core.Bonk | ||||||
| { | { | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// A Shape defined by an arbitrary collection of vertices. |     /// A Shape defined by an arbitrary collection of vertices. | ||||||
|     /// NOTE: A Polygon must have more than 2 vertices and should not have duplicate vertices. |     /// NOTE: A Polygon must have more than 2 vertices, be convex, and should not have duplicate vertices. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public struct Polygon : IShape2D, IEquatable<IShape2D> |     public struct Polygon : IShape2D, IEquatable<IShape2D> | ||||||
|     { |     { | ||||||
|  |  | ||||||
|  | @ -9,6 +9,44 @@ namespace Tests | ||||||
| { | { | ||||||
|     public class EqualityTests |     public class EqualityTests | ||||||
|     { |     { | ||||||
|  |         public class PointTests | ||||||
|  |         { | ||||||
|  |             [Test] | ||||||
|  |             public void PointEqual() | ||||||
|  |             { | ||||||
|  |                 var a = new Point(1, 1); | ||||||
|  |                 var b = new Point(1, 1); | ||||||
|  | 
 | ||||||
|  |                 a.Should().BeEquivalentTo(b); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void PointNotEqual() | ||||||
|  |             { | ||||||
|  |                 var a = new Point(1, 1); | ||||||
|  |                 var b = new Point(-1, 1); | ||||||
|  | 
 | ||||||
|  |                 a.Should().NotBeEquivalentTo(b); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void PointEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var a = new Point(1, 1); | ||||||
|  |                 var b = new Point(1, 1); | ||||||
|  |                 (a == b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             [Test] | ||||||
|  |             public void PointNotEqualOperator() | ||||||
|  |             { | ||||||
|  |                 var a = new Point(1, 1); | ||||||
|  |                 var b = new Point(-1, 1); | ||||||
|  | 
 | ||||||
|  |                 (a != b).Should().BeTrue(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         public class CircleTests |         public class CircleTests | ||||||
|         { |         { | ||||||
|             [Test] |             [Test] | ||||||
|  |  | ||||||
|  | @ -8,6 +8,91 @@ namespace Tests | ||||||
| { | { | ||||||
|     public class GJK2DTest |     public class GJK2DTest | ||||||
|     { |     { | ||||||
|  |         [Test] | ||||||
|  |         public void PointLineOverlapping() | ||||||
|  |         { | ||||||
|  |             var point = new Point(1, 1); | ||||||
|  |             var line = new Line(new Position2D(-2, -2), new Position2D(2, 2)); | ||||||
|  | 
 | ||||||
|  |             GJK2D.TestCollision(point, Transform2D.DefaultTransform, line, Transform2D.DefaultTransform).Should().BeTrue(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [Test] | ||||||
|  |         public void PointLineNotOverlapping() | ||||||
|  |         { | ||||||
|  |             var point = new Point(1, 1); | ||||||
|  |             var line = new Line(new Position2D(-3, -2), new Position2D(-9, -5)); | ||||||
|  | 
 | ||||||
|  |             GJK2D.TestCollision(point, Transform2D.DefaultTransform, line, Transform2D.DefaultTransform).Should().BeFalse(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [Test] | ||||||
|  |         public void PointCircleOverlapping() | ||||||
|  |         { | ||||||
|  |             var point = new Point(); | ||||||
|  |             var circle = new Circle(3); | ||||||
|  | 
 | ||||||
|  |             var pointTransform = new Transform2D(new Position2D(1, 1)); | ||||||
|  |             var circleTransform = new Transform2D(new Position2D(-1, 0)); | ||||||
|  | 
 | ||||||
|  |             GJK2D.TestCollision(point, pointTransform, circle, circleTransform).Should().BeTrue(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [Test] | ||||||
|  |         public void PointCircleNotOverlapping() | ||||||
|  |         { | ||||||
|  |             var point = new Point(3, 0); | ||||||
|  |             var circle = new Circle(1); | ||||||
|  | 
 | ||||||
|  |             GJK2D.TestCollision(point, Transform2D.DefaultTransform, circle, Transform2D.DefaultTransform).Should().BeFalse(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [Test] | ||||||
|  |         public void PointRectangleOverlapping() | ||||||
|  |         { | ||||||
|  |             var point = new Point(1, 1); | ||||||
|  |             var rectangle = new Rectangle(-2, -2, 2, 2); | ||||||
|  | 
 | ||||||
|  |             GJK2D.TestCollision(point, Transform2D.DefaultTransform, rectangle, Transform2D.DefaultTransform).Should().BeTrue(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [Test] | ||||||
|  |         public void PointRectangleNotOverlapping() | ||||||
|  |         { | ||||||
|  |             var point = new Point(5, 5); | ||||||
|  |             var rectangle = new Rectangle(-2, -2, 2, 2); | ||||||
|  | 
 | ||||||
|  |             GJK2D.TestCollision(point, Transform2D.DefaultTransform, rectangle, Transform2D.DefaultTransform).Should().BeFalse(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [Test] | ||||||
|  |         public void PointPolygonOverlapping() | ||||||
|  |         { | ||||||
|  |             var point = new Point(1, 1); | ||||||
|  |             var polygon = new Polygon( | ||||||
|  |                 new Position2D(-2, -2), | ||||||
|  |                 new Position2D(-3, 2), | ||||||
|  |                 new Position2D(3, 2), | ||||||
|  |                 new Position2D(3, -2) | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             GJK2D.TestCollision(point, Transform2D.DefaultTransform, polygon, Transform2D.DefaultTransform).Should().BeTrue(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         [Test] | ||||||
|  |         public void PointPolygonNotOverlapping() | ||||||
|  |         { | ||||||
|  |             var point = new Point(5, 5); | ||||||
|  |             var polygon = new Polygon( | ||||||
|  |                 new Position2D(-2, -2), | ||||||
|  |                 new Position2D(-3, 2), | ||||||
|  |                 new Position2D(3, 2), | ||||||
|  |                 new Position2D(3, -2) | ||||||
|  |             ); | ||||||
|  | 
 | ||||||
|  |             GJK2D.TestCollision(point, Transform2D.DefaultTransform, polygon, Transform2D.DefaultTransform).Should().BeFalse(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         [Test] |         [Test] | ||||||
|         public void LineLineOverlapping() |         public void LineLineOverlapping() | ||||||
|         { |         { | ||||||
|  |  | ||||||
|  | @ -34,6 +34,9 @@ namespace Tests | ||||||
|             var line = new MoonTools.Core.Bonk.Line(new Position2D(20, -4), new Position2D(22, -12)); |             var line = new MoonTools.Core.Bonk.Line(new Position2D(20, -4), new Position2D(22, -12)); | ||||||
|             var lineTransform = new Transform2D(new Vector2(0, 0)); |             var lineTransform = new Transform2D(new Vector2(0, 0)); | ||||||
| 
 | 
 | ||||||
|  |             var point = new MoonTools.Core.Bonk.Point(8, 8); | ||||||
|  |             var pointTransform = Transform2D.DefaultTransform; | ||||||
|  | 
 | ||||||
|             spatialHash.Insert(0, rectA, rectATransform); |             spatialHash.Insert(0, rectA, rectATransform); | ||||||
|             spatialHash.Insert(1, rectB, rectBTransform); |             spatialHash.Insert(1, rectB, rectBTransform); | ||||||
|             spatialHash.Insert(2, rectC, rectCTransform); |             spatialHash.Insert(2, rectC, rectCTransform); | ||||||
|  | @ -41,9 +44,11 @@ namespace Tests | ||||||
|             spatialHash.Insert(4, circleA, circleATransform); |             spatialHash.Insert(4, circleA, circleATransform); | ||||||
|             spatialHash.Insert(1, circleB, circleBTransform); |             spatialHash.Insert(1, circleB, circleBTransform); | ||||||
|             spatialHash.Insert(6, line, lineTransform); |             spatialHash.Insert(6, line, lineTransform); | ||||||
|  |             spatialHash.Insert(7, point, pointTransform); | ||||||
| 
 | 
 | ||||||
|             spatialHash.Retrieve(0, rectA, rectATransform).Should().BeEmpty(); |             spatialHash.Retrieve(0, rectA, rectATransform).Should().BeEmpty(); | ||||||
|             spatialHash.Retrieve(1, rectB, rectBTransform).Should().NotContain((1, circleB, circleBTransform)); |             spatialHash.Retrieve(1, rectB, rectBTransform).Should().NotContain((1, circleB, circleBTransform)); | ||||||
|  |             spatialHash.Retrieve(1, rectB, rectBTransform).Should().Contain((7, point, pointTransform)); | ||||||
|             spatialHash.Retrieve(2, rectC, rectCTransform).Should().Contain((6, line, lineTransform)).And.Contain((4, circleA, circleATransform)); |             spatialHash.Retrieve(2, rectC, rectCTransform).Should().Contain((6, line, lineTransform)).And.Contain((4, circleA, circleATransform)); | ||||||
|             spatialHash.Retrieve(3, rectD, rectDTransform).Should().Contain((1, circleB, circleBTransform)); |             spatialHash.Retrieve(3, rectD, rectDTransform).Should().Contain((1, circleB, circleBTransform)); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue