using System; using System.Collections.Generic; using System.Linq; using System.Text; using Azimuth; using Annulus.DeprecatedShapes; using Lodestone.ContinuousCollisionDetection; namespace Lodestone.UnitTests.ContinuousCollisionDetection { public class SweptSphereSphereTests : UnitTestSharp.TestFixture { public class NoMotionTests : UnitTestSharp.TestFixture { public void NoMotion_Cocentric_DifferentSizes() { Frame stationary_Origin = new Frame(); var circle1 = new Circle(5.0); var circle2 = new Circle(2.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, stationary_Origin, circle2, stationary_Origin); CheckEqual(new Interval(0, Scalar.PositiveInfinity), collisionWindow); } public void NoMotion_Cocentric_SameSize() { Frame stationary_Origin = new Frame(); var circle1 = new Circle(5.0); var circle2 = new Circle(5.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, stationary_Origin, circle2, stationary_Origin); CheckEqual(new Interval(0, Scalar.PositiveInfinity), collisionWindow); } public void NoMotion_Intersecting() { Frame stationary_Origin = new Frame(); Frame stationary_Side = new Frame { Position = new Vector(9, 0), }; var circle1 = new Circle(5.0); var circle2 = new Circle(5.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, stationary_Origin, circle2, stationary_Origin); CheckEqual(new Interval(0, Scalar.PositiveInfinity), collisionWindow); } public void NoMotion_Intersecting_Incident() { Frame stationary_Origin = new Frame(); Frame stationary_Side = new Frame { Position = new Vector(10, 0), }; var circle1 = new Circle(5.0); var circle2 = new Circle(5.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, stationary_Origin, circle2, stationary_Side); CheckEqual(null, collisionWindow); } public void NoMotion_Disparate() { Frame stationary_Origin = new Frame(); Frame stationary_Side = new Frame { Position = new Vector(11, 0), }; var circle1 = new Circle(5.0); var circle2 = new Circle(5.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, stationary_Origin, circle2, stationary_Side); CheckEqual(null, collisionWindow); } } public class LinearMotionTests : UnitTestSharp.TestFixture { public void OneSecond_OneSecond() { Frame stationary_Origin = new Frame(); Frame stationary_Side = new Frame { Position = new Vector(6, 0), Velocity = new Vector(-4, 0), }; var circle1 = new Circle(1.0); var circle2 = new Circle(1.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, stationary_Origin, circle2, stationary_Side); CheckEqual(new Interval(1, 2), collisionWindow); } public void Miss() { Frame stationary_Origin = new Frame(); Frame stationary_Side = new Frame { Position = new Vector(6, 0), Velocity = new Vector(4, 0), }; var circle1 = new Circle(1.0); var circle2 = new Circle(1.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, stationary_Origin, circle2, stationary_Side); CheckEqual(null, collisionWindow); } public void CoMovement() { Frame stationary_Origin = new Frame { Velocity = new Vector(4, 0), }; Frame stationary_Side = new Frame { Position = new Vector(2, 0), Velocity = new Vector(4, 0), }; var circle1 = new Circle(1.0); var circle2 = new Circle(1.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, stationary_Origin, circle2, stationary_Side); CheckEqual(null, collisionWindow); } public void Conjoined_Separate() { Frame stationary_Origin = new Frame { Velocity = new Vector(-4, 0), }; Frame stationary_Side = new Frame { Position = new Vector(2, 0), Velocity = new Vector(4, 0), }; var circle1 = new Circle(1.0); var circle2 = new Circle(1.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, stationary_Origin, circle2, stationary_Side); CheckEqual(null, collisionWindow); } public void Conjoined_Converge() { Frame stationary_Origin = new Frame { Velocity = new Vector(2, 0), }; Frame stationary_Side = new Frame { Position = new Vector(2, 0), Velocity = new Vector(-2, 0), }; var circle1 = new Circle(1.0); var circle2 = new Circle(1.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, stationary_Origin, circle2, stationary_Side); CheckEqual(new Interval(0, 1), collisionWindow); } public void Glancing_Converge() { Frame stationary_Origin = new Frame { Velocity = new Vector(2, 0), }; Frame stationary_Side = new Frame { Position = new Vector(6, -2), Velocity = new Vector(-2, 0), }; var circle1 = new Circle(1.0); var circle2 = new Circle(1.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, stationary_Origin, circle2, stationary_Side); CheckEqual(null, collisionWindow); } public void Glancing_Separate() { Frame stationary_Origin = new Frame { Velocity = new Vector(2, 0), }; Frame stationary_Side = new Frame { Position = new Vector(0, -2), Velocity = new Vector(-2, 0), }; var circle1 = new Circle(1.0); var circle2 = new Circle(1.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, stationary_Origin, circle2, stationary_Side); CheckEqual(null, collisionWindow); } } public class AccelerationMotionTests : UnitTestSharp.TestFixture { public void OneSecond_OneSecond() { Frame stationary_Origin = new Frame(); Frame stationary_Side = new Frame { Acceleration = new Vector(-8.0/3.0, 0), Position = new Vector(10.0/3.0, 0), }; var circle1 = new Circle(1.0); var circle2 = new Circle(1.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, stationary_Side, circle2, stationary_Origin); CheckEqual(new Interval(1, 2), collisionWindow); } public void Miss() { Frame Origin = new Frame(); Frame Side = new Frame { Position = new Vector(6, 0), Acceleration = new Vector(1, 0), }; var circle1 = new Circle(1.0); var circle2 = new Circle(1.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, Origin, circle2, Side); CheckEqual(null, collisionWindow); } public void DoublePenetrate() //heh heh { Frame Origin = new Frame(); Frame Side = new Frame { Position = new Vector(0, -6), Velocity = new Vector(0, 6), Acceleration = new Vector(0, -1), }; var circle1 = new Circle(1.0); var circle2 = new Circle(1.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, Origin, circle2, Side); CheckEqual(new Interval(6 - Math.Sqrt(28), 6 - Math.Sqrt(20)), collisionWindow); } public void GlancingThenOverlap() { Frame Origin = new Frame() { Position = new Vector(-2, 0), Velocity = new Vector(0, 12), Acceleration = new Vector(0, -1), }; Frame Side = new Frame { Velocity = new Vector(12, 0), Acceleration = new Vector(-1, 0), }; var circle1 = new Circle(1.0); var circle2 = new Circle(1.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, Origin, circle2, Side); CheckEqual(new Interval(24, 24.165525061), collisionWindow); } public void DoubleRootWhileLeaving() { Frame Origin = new Frame() { }; Frame Side = new Frame { Position = new Vector(0, -97), Velocity = new Vector(0, 20), Acceleration = new Vector(0, -2), }; var circle1 = new Circle(2.0); var circle2 = new Circle(1.0); var collisionWindow = SweptCircleCircle.CalculateCollisionWindows( circle1, Origin, circle2, Side); CheckEqual(new Interval(10 - Math.Sqrt(6), 10 + Math.Sqrt(6)), collisionWindow); } } } }