namespace MathTests; [TestClass] public class LineTest { /// /// The basic accessors should reflect the two construction points. /// [TestMethod] public void ConstructAndAccessors() { var line = new Line( new Vector3( 0, 0, 0 ), new Vector3( 100, 0, 0 ) ); Assert.AreEqual( new Vector3( 0, 0, 0 ), line.Start ); Assert.AreEqual( new Vector3( 100, 0, 0 ), line.End ); Assert.AreEqual( new Vector3( 100, 0, 0 ), line.Delta ); Assert.AreEqual( new Vector3( 50, 0, 0 ), line.Center ); } /// /// The origin/direction/length constructor should produce the same line as /// the two-point constructor. /// [TestMethod] public void ConstructFromDirection() { var line = new Line( Vector3.Zero, new Vector3( 1, 0, 0 ), 100 ); Assert.AreEqual( new Vector3( 100, 0, 0 ), line.End ); } /// /// ClosestPoint should project onto the segment and clamp to the /// end points when the query lies beyond them. /// [TestMethod] public void ClosestPointClampsToSegment() { var line = new Line( new Vector3( 0, 0, 0 ), new Vector3( 100, 0, 0 ) ); Assert.AreEqual( new Vector3( 50, 0, 0 ), line.ClosestPoint( new Vector3( 50, 10, 0 ) ) ); Assert.AreEqual( new Vector3( 0, 0, 0 ), line.ClosestPoint( new Vector3( -50, 10, 0 ) ) ); Assert.AreEqual( new Vector3( 100, 0, 0 ), line.ClosestPoint( new Vector3( 150, 10, 0 ) ) ); } /// /// Distance should be the distance to the closest point on the segment, /// and SqrDistance should be its square. /// [TestMethod] public void DistanceMatchesClosestPoint() { var line = new Line( new Vector3( 0, 0, 0 ), new Vector3( 100, 0, 0 ) ); var query = new Vector3( 50, 10, 0 ); Assert.AreEqual( 10f, line.Distance( query ), 0.001f ); Assert.AreEqual( 100f, line.SqrDistance( query ), 0.001f ); var dist = line.Distance( query, out var closest ); Assert.AreEqual( 10f, dist, 0.001f ); Assert.AreEqual( new Vector3( 50, 0, 0 ), closest ); } /// /// A ray crossing through the line within the given radius should trace true, /// a distant ray should trace false. /// [TestMethod] public void Trace() { var line = new Line( new Vector3( 0, 0, 0 ), new Vector3( 100, 0, 0 ) ); var crossing = new Ray( new Vector3( 50, -10, 0 ), new Vector3( 0, 1, 0 ) ); Assert.IsTrue( line.Trace( crossing, 1f ) ); var missing = new Ray( new Vector3( 50, -10, 50 ), new Vector3( 0, 1, 0 ) ); Assert.IsFalse( line.Trace( missing, 1f ) ); } /// /// ClosestPoint against a ray should find the mutually closest points /// on the segment and on the ray. /// [TestMethod] public void ClosestPointToRay() { var line = new Line( new Vector3( 0, 0, 0 ), new Vector3( 100, 0, 0 ) ); var ray = new Ray( new Vector3( 50, -10, 5 ), new Vector3( 0, 1, 0 ) ); Assert.IsTrue( line.ClosestPoint( ray, out var onLine, out var onRay ) ); Assert.AreEqual( new Vector3( 50, 0, 0 ), onLine ); Assert.AreEqual( new Vector3( 50, 0, 5 ), onRay ); } /// /// Lines with the same end points should be equal. /// [TestMethod] public void Equality() { var a = new Line( Vector3.Zero, Vector3.One ); var b = new Line( Vector3.Zero, Vector3.One ); Assert.IsTrue( a.Equals( b ) ); } }