using System; using System.Collections.Generic; using System.Linq; using System.Text; using Annulus.DiscreteCollisionDetection; using Annulus; using Azimuth; namespace Annulus.UnitTests.DiscreteCollisionDetection { public class SegmentPointTests : UnitTestSharp.TestFixture { public class DistanceSquaredTests : UnitTestSharp.TestFixture { public void Basic() { Scalar distance = SegmentPoint.DistanceSquared(new Line { From = new Vector(-10, 0), To = new Vector(3, 0), }, new Vector(0, 3)); CheckEqual(9, distance); } public void TooLeft() { Scalar distance = SegmentPoint.DistanceSquared(new Line { From = new Vector(-1, 0), To = new Vector(1, 0), }, new Vector(-3, 0)); CheckEqual(4, distance); } public void TooRight() { Scalar distance = SegmentPoint.DistanceSquared(new Line { From = new Vector(-1, 0), To = new Vector(1, 0), }, new Vector(3, 0)); CheckEqual(4, distance); } public void DegenerateLine_SamePoint() { Scalar distance = SegmentPoint.DistanceSquared(new Line { From = new Vector(1, 0), To = new Vector(1, 0), }, new Vector(1, 0)); CheckEqual(0, distance); } public void DegenerateLine_DifferentPoint() { Scalar distance = SegmentPoint.DistanceSquared(new Line { From = new Vector(1, 0), To = new Vector(1, 0), }, new Vector(5, 0)); CheckEqual(16, distance); } public void NaNs_Line() { Scalar distance = SegmentPoint.DistanceSquared(new Line { From = new Vector(Scalar.NaN, 0), To = new Vector(1, 0), }, new Vector(5, 0)); Check(Scalar.IsNaN(distance)); } public void NaNs_Point() { Scalar distance = SegmentPoint.DistanceSquared(new Line { From = new Vector(2, 0), To = new Vector(1, 0), }, new Vector(Scalar.NaN, 0)); Check(Scalar.IsNaN(distance)); } } public class DistanceTests : UnitTestSharp.TestFixture { public void Basic() { Scalar distance = SegmentPoint.Distance(new Line { From = new Vector(-10, 0), To = new Vector(3, 0), }, new Vector(0, 3)); CheckEqual(3, distance); } public void TooLeft() { Scalar distance = SegmentPoint.Distance(new Line { From = new Vector(-1, 0), To = new Vector(1, 0), }, new Vector(-3, 0)); CheckEqual(2, distance); } public void TooRight() { Scalar distance = SegmentPoint.Distance(new Line { From = new Vector(-1, 0), To = new Vector(1, 0), }, new Vector(3, 0)); CheckEqual(2, distance); } public void DegenerateLine_SamePoint() { Scalar distance = SegmentPoint.Distance(new Line { From = new Vector(1, 0), To = new Vector(1, 0), }, new Vector(1, 0)); CheckEqual(0, distance); } public void DegenerateLine_DifferentPoint() { Scalar distance = SegmentPoint.Distance(new Line { From = new Vector(1, 0), To = new Vector(1, 0), }, new Vector(5, 0)); CheckEqual(4, distance); } public void NaNs_Line() { Scalar distance = SegmentPoint.Distance(new Line { From = new Vector(Scalar.NaN, 0), To = new Vector(1, 0), }, new Vector(5, 0)); Check(Scalar.IsNaN(distance)); } public void NaNs_Point() { Scalar distance = SegmentPoint.Distance(new Line { From = new Vector(2, 0), To = new Vector(1, 0), }, new Vector(Scalar.NaN, 0)); Check(Scalar.IsNaN(distance)); } } public class ClosestPointOnSegmentToPointTests : UnitTestSharp.TestFixture { public void Basic() { Vector pt = new Vector(0, 0); var line = new Line { From = new Vector(-1, 0), To = new Vector(1, 0), }; Scalar t = SegmentPoint.ClosestPointOnSegmentToPoint(line, pt); CheckEqual(0.5, t); } public void Perpindicular() { Vector pt = new Vector(0, 7); var line = new Line { From = new Vector(-1, 0), To = new Vector(1, 0), }; Scalar t = SegmentPoint.ClosestPointOnSegmentToPoint(line, pt); CheckEqual(0.5, t); } public void LargeFraction() { Vector pt = new Vector(7, 7); var line = new Line { From = new Vector(0, 0), To = new Vector(1, 0), }; Scalar t = SegmentPoint.ClosestPointOnSegmentToPoint(line, pt); CheckEqual(1, t); } public void SmallFraction() { Vector pt = new Vector(-7, 7); var line = new Line { From = new Vector(0, 0), To = new Vector(1, 0), }; Scalar t = SegmentPoint.ClosestPointOnSegmentToPoint(line, pt); CheckEqual(0, t); } public void Infinity_Perp() { Vector pt = new Vector(0, Scalar.PositiveInfinity); var line = new Line { From = new Vector(-1, 0), To = new Vector(1, 0), }; Scalar t = SegmentPoint.ClosestPointOnSegmentToPoint(line, pt); Check(Scalar.IsNaN(t)); } public void Infinity_Parallel() { Vector pt = new Vector(Scalar.PositiveInfinity, 0); var line = new Line { From = new Vector(-1, 0), To = new Vector(1, 0), }; Scalar t = SegmentPoint.ClosestPointOnSegmentToPoint(line, pt); CheckEqual(1, t); } public void Line_Infinity() { Vector pt = new Vector(0, 0); var line = new Line { From = new Vector(Scalar.NegativeInfinity, 0), To = new Vector(Scalar.PositiveInfinity, 0), }; Scalar t = SegmentPoint.ClosestPointOnSegmentToPoint(line, pt); Check(Scalar.IsNaN(t)); } } } }