public static void CircleCollider_IsHitByTest( float cx, float cy, float r, float rx, float ry, float directionX, float directionY, float distance, bool shouldHit, float ix = 0f, float iy = 0f, float nx = 0f, float ny = 0f) { using (var circleBody = new DynamicBody()) { circleBody.SetWorldPosition(new Vector2(cx, cy)); circleBody.Collider = new CircleCollider(r); circleBody.Initialize(null); var ray = new LineSegment(new Vector2(rx, ry), new Vector2(directionX, directionY), distance); Assert.AreEqual(shouldHit, circleBody.Collider.IsHitBy(ray, out var hit)); if (shouldHit) { var normal = new Vector2(nx, ny); var intersection = new Vector2(ix, iy); Assert.AreEqual(normal.X, hit.Normal.X, 0.0001f); Assert.AreEqual(normal.Y, hit.Normal.Y, 0.0001f); Assert.AreEqual(intersection.X, hit.ContactPoint.X, 0.0001f); Assert.AreEqual(intersection.Y, hit.ContactPoint.Y, 0.0001f); Assert.AreEqual(circleBody.Collider, hit.Collider); } } }
public static void PolygonCollider_ContainsPoint(float x1, float y1, float w, float h, float x2, float y2, bool shouldContain) { using (var quadBody = new DynamicBody()) { quadBody.SetWorldPosition(new Vector2(x1, y1)); quadBody.Collider = PolygonCollider.CreateRectangle(w, h); quadBody.Initialize(null); Assert.AreEqual(shouldContain, quadBody.Collider.Contains(new Vector2(x2, y2))); } }
public static void CircleCollider_ContainsPointTest(float x1, float y1, float r1, float x2, float y2, bool shouldContain) { using (var circleBody = new DynamicBody()) { circleBody.SetWorldPosition(new Vector2(x1, y1)); circleBody.Collider = new CircleCollider(r1); var circle = circleBody.Collider as CircleCollider; circleBody.Initialize(null); Assert.AreEqual(shouldContain, circle.Contains(new Vector2(x2, y2))); } }
public static void CircleCollider_CollidesWithQuadTest(float x1, float y1, float r1, float x2, float y2, float w, float h, bool collisionOccured) { using (var circleBody = new DynamicBody()) using (var quadBody = new DynamicBody()) { circleBody.SetWorldPosition(new Vector2(x1, y1)); circleBody.Collider = new CircleCollider(r1); circleBody.Initialize(null); quadBody.SetWorldPosition(new Vector2(x2, y2)); quadBody.Collider = PolygonCollider.CreateRectangle(w, h); quadBody.Initialize(null); Assert.AreEqual(collisionOccured, circleBody.Collider.CollidesWith(quadBody.Collider, out var collision1)); Assert.AreEqual(collisionOccured, quadBody.Collider.CollidesWith(circleBody.Collider, out var collision2)); if (collisionOccured) { Assert.AreEqual(collision1.MinimumTranslationVector.Length(), collision2.MinimumTranslationVector.Length(), 0.0001f); Assert.AreEqual(collision1.FirstCollider, collision2.SecondCollider); Assert.AreEqual(collision1.SecondCollider, collision2.FirstCollider); Assert.AreEqual(collision1.FirstContainsSecond, collision2.SecondContainsFirst); Assert.AreEqual(collision1.SecondContainsFirst, collision2.FirstContainsSecond); var originalPosition = circleBody.WorldTransform.Position; circleBody.SetWorldPosition(originalPosition + collision1.MinimumTranslationVector); Assert.False(circleBody.Collider.CollidesWith(quadBody.Collider, out collision1)); circleBody.SetWorldPosition(originalPosition); quadBody.SetWorldPosition(quadBody.WorldTransform.Position + collision2.MinimumTranslationVector); Assert.False(quadBody.Collider.CollidesWith(circleBody.Collider, out collision2)); } else { Assert.Null(collision1); Assert.Null(collision2); } } }
public static void RectangleCollider_RectangleCollidesWithRectangleTest(float x1, float y1, float w1, float h1, float x2, float y2, float w2, float h2, bool collisionOccured) { using (var rectangleBody1 = new DynamicBody()) using (var rectangleBody2 = new DynamicBody()) { rectangleBody1.SetWorldPosition(new Vector2(x1, y1)); rectangleBody1.Collider = new RectangleCollider(w1, h2); rectangleBody1.Initialize(null); rectangleBody2.SetWorldPosition(new Vector2(x2, y2)); rectangleBody2.Collider = new RectangleCollider(w2, h2); rectangleBody2.Initialize(null); Assert.AreEqual(collisionOccured, rectangleBody1.Collider.CollidesWith(rectangleBody2.Collider, out var collision1)); Assert.AreEqual(collisionOccured, rectangleBody2.Collider.CollidesWith(rectangleBody1.Collider, out var collision2)); if (collisionOccured) { Assert.AreEqual(collision1.MinimumTranslationVector.Length(), collision2.MinimumTranslationVector.Length(), 0.0001f); Assert.AreEqual(collision1.FirstCollider, collision2.SecondCollider); Assert.AreEqual(collision1.SecondCollider, collision2.FirstCollider); Assert.AreEqual(collision1.FirstContainsSecond, collision2.SecondContainsFirst); Assert.AreEqual(collision1.SecondContainsFirst, collision2.FirstContainsSecond); var originalPosition = rectangleBody1.WorldTransform.Position; rectangleBody1.SetWorldPosition(originalPosition + collision1.MinimumTranslationVector); Assert.False(rectangleBody1.Collider.CollidesWith(rectangleBody2.Collider, out collision1)); rectangleBody1.SetWorldPosition(originalPosition); rectangleBody2.SetWorldPosition(rectangleBody2.WorldTransform.Position + collision2.MinimumTranslationVector); Assert.False(rectangleBody2.Collider.CollidesWith(rectangleBody1.Collider, out collision2)); } else { Assert.Null(collision1); Assert.Null(collision2); } } }
public static void CircleCollider_ContainsQuadTest(float x1, float y1, float r1, float x2, float y2, float w, float h, bool shouldContain) { using (var circleBody = new DynamicBody()) using (var quadBody = new DynamicBody()) { circleBody.SetWorldPosition(new Vector2(x1, y1)); circleBody.Collider = new CircleCollider(r1); circleBody.Initialize(null); quadBody.SetWorldPosition(new Vector2(x2, y2)); quadBody.Collider = PolygonCollider.CreateRectangle(w, h); quadBody.Initialize(null); Assert.AreEqual(shouldContain, circleBody.Collider.Contains(quadBody.Collider)); } }
public static void CircleCollider_ContainsCircleTest(float x1, float y1, float r1, float x2, float y2, float r2, bool shouldContain) { using (var circleBody1 = new DynamicBody()) using (var circleBody2 = new DynamicBody()) { circleBody1.SetWorldPosition(new Vector2(x1, y1)); circleBody1.Collider = new CircleCollider(r1); circleBody1.Initialize(null); circleBody2.SetWorldPosition(new Vector2(x2, y2)); circleBody2.Collider = new CircleCollider(r2); circleBody2.Initialize(null); Assert.AreEqual(shouldContain, circleBody1.Collider.Contains(circleBody2.Collider)); } }
public static void PolygonCollider_ContainsPolygon(float x1, float y1, float w1, float h1, float x2, float y2, float w2, float h2, bool shouldContain) { using (var quadBody1 = new DynamicBody()) using (var quadBody2 = new DynamicBody()) { quadBody1.SetWorldPosition(new Vector2(x1, y1)); quadBody1.Collider = PolygonCollider.CreateRectangle(w1, w1); quadBody1.Initialize(null); quadBody2.SetWorldPosition(new Vector2(x2, y2)); quadBody2.Collider = PolygonCollider.CreateRectangle(w2, w2); quadBody2.Initialize(null); Assert.AreEqual(shouldContain, quadBody1.Collider.Contains(quadBody2.Collider)); } }
public static void PolyGonCollider_QuadIsHitByTest(float qx, float qy, float qw, float qh, float rx, float ry, float directionX, float directionY, float distance, bool shouldHit, float ix = 0f, float iy = 0f, float nx = 0f, float ny = 0f) { using (var quadBody = new DynamicBody()) { quadBody.SetWorldPosition(new Vector2(qx, qy)); quadBody.Collider = PolygonCollider.CreateRectangle(qw, qh); quadBody.Initialize(null); var ray = new LineSegment(new Vector2(rx, ry), new Vector2(directionX, directionY), distance); Assert.AreEqual(shouldHit, quadBody.Collider.IsHitBy(ray, out var hit)); if (shouldHit) { var normal = new Vector2(nx, ny); var intersection = new Vector2(ix, iy); Assert.AreEqual(normal, hit.Normal); Assert.AreEqual(intersection, hit.ContactPoint); Assert.AreEqual(quadBody.Collider, hit.Collider); } } }