using System; using System.Collections.Generic; using System.Linq; using System.Text; using Annulus.DiscreteCollisionDetection; using Azimuth; namespace Annulus.UnitTests.DiscreteCollisionDetection { public class ConnectingSegmentvsRayTests : UnitTestSharp.TestFixture { public void Basic() { var edge1 = new Ray { Direction = new Vector(0, 1), From = new Vector(-1, 0), }; var edge2 = new Ray { Direction = new Vector(0, 1), From = new Vector(1, 0), }; var ray = new Ray { Direction = new Vector(0, -1), From = new Vector(0, 4), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(true, result); CheckEqual(2, TOI); CheckEqual(0.5, fraction); } public void Miss_Left() { var edge1 = new Ray { Direction = new Vector(0, 1), From = new Vector(-1, 0), }; var edge2 = new Ray { Direction = new Vector(0, 1), From = new Vector(1, 0), }; var ray = new Ray { Direction = new Vector(0, -1), From = new Vector(-2, 4), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(false, result); Check(Scalar.IsNaN(TOI)); Check(Scalar.IsNaN(fraction)); } public void Miss_Right() { var edge1 = new Ray { Direction = new Vector(0, 1), From = new Vector(-1, 0), }; var edge2 = new Ray { Direction = new Vector(0, 1), From = new Vector(1, 0), }; var ray = new Ray { Direction = new Vector(0, -1), From = new Vector(2, 4), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(false, result); Check(Scalar.IsNaN(TOI)); Check(Scalar.IsNaN(fraction)); } public void WrongDirection() { var edge1 = new Ray { Direction = new Vector(0, 1), From = new Vector(-1, 0), }; var edge2 = new Ray { Direction = new Vector(0, 1), From = new Vector(1, 0), }; var ray = new Ray { Direction = new Vector(0, 1), From = new Vector(0, 4), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(false, result); Check(Scalar.IsNaN(TOI)); Check(Scalar.IsNaN(fraction)); } public void Stationary() { var edge1 = new Ray { Direction = new Vector(0, 0), From = new Vector(-1, 0), }; var edge2 = new Ray { Direction = new Vector(0, 0), From = new Vector(1, 0), }; var ray = new Ray { Direction = new Vector(0, 0), From = new Vector(2, 4), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(false, result); Check(Scalar.IsNaN(TOI)); Check(Scalar.IsNaN(fraction)); } public void Overlapping_Miss() { var edge1 = new Ray { Direction = new Vector(0, -1), From = new Vector(0, 0), }; var edge2 = new Ray { Direction = new Vector(0, -1), From = new Vector(0, 0), }; var ray = new Ray { Direction = new Vector(0, -1), From = new Vector(0, 4), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(false, result); Check(Scalar.IsNaN(TOI)); Check(Scalar.IsNaN(fraction)); } public void Overlapping_Hit() { var edge1 = new Ray { Direction = new Vector(0, 1), From = new Vector(0, 0), }; var edge2 = new Ray { Direction = new Vector(0, 1), From = new Vector(0, 0), }; var ray = new Ray { Direction = new Vector(0, -1), From = new Vector(0, 4), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(true, result); CheckEqual(2, TOI); CheckEqual(0, fraction); } public void RayEdge1_Converge() { var edge1 = new Ray { Direction = new Vector(0, 1), From = new Vector(0, 0), }; var edge2 = new Ray { Direction = new Vector(0, 1), From = new Vector(1, 0), }; var ray = new Ray { Direction = new Vector(0, 1), From = new Vector(0, 0), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(true, result); CheckEqual(0, TOI); CheckEqual(0, fraction); } public void RayEdge1_Diverge() { var edge1 = new Ray { Direction = new Vector(0, 1), From = new Vector(0, 0), }; var edge2 = new Ray { Direction = new Vector(0, 1), From = new Vector(1, 0), }; var ray = new Ray { Direction = new Vector(0, -1), From = new Vector(0, 0), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(true, result); CheckEqual(0, TOI); CheckEqual(0, fraction); } public void RayEdge2_Converge() { var edge1 = new Ray { Direction = new Vector(0, 1), From = new Vector(1, 0), }; var edge2 = new Ray { Direction = new Vector(0, 1), From = new Vector(0, 0), }; var ray = new Ray { Direction = new Vector(0, 1), From = new Vector(0, 0), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(true, result); CheckEqual(0, TOI); CheckEqual(1, fraction); } public void RayEdge2_Diverge() { var edge1 = new Ray { Direction = new Vector(0, 1), From = new Vector(1, 0), }; var edge2 = new Ray { Direction = new Vector(0, 1), From = new Vector(0, 0), }; var ray = new Ray { Direction = new Vector(0, -1), From = new Vector(0, 0), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(true, result); CheckEqual(0, TOI); CheckEqual(1, fraction); } public void RayMid_Converge() { var edge1 = new Ray { Direction = new Vector(0, 1), From = new Vector(1, 0), }; var edge2 = new Ray { Direction = new Vector(0, 1), From = new Vector(0, 0), }; var ray = new Ray { Direction = new Vector(0, 1), From = new Vector(0.5, 0), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(true, result); CheckEqual(0, TOI); CheckEqual(0.5, fraction); } public void RayMid_Diverge() { var edge1 = new Ray { Direction = new Vector(0, 1), From = new Vector(1, 0), }; var edge2 = new Ray { Direction = new Vector(0, 1), From = new Vector(0, 0), }; var ray = new Ray { Direction = new Vector(0, -1), From = new Vector(0.5, 0), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(true, result); CheckEqual(0, TOI); CheckEqual(0.5, fraction); } public void InvertedCone() { var edge1 = new Ray { Direction = new Vector(1, -1), From = new Vector(1, -2), }; var edge2 = new Ray { Direction = new Vector(1, 1), From = new Vector(1, -1), }; var ray = new Ray { Direction = new Vector(1, -1), From = new Vector(1, 1), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(true, result); CheckEqual(1, TOI); CheckEqual(1, fraction); } public void CollapseThenHit() { var edge1 = new Ray { Direction = new Vector(0, 0), From = new Vector(0, 0), }; var edge2 = new Ray { Direction = new Vector(0, -1), From = new Vector(0, 1), }; var ray = new Ray { Direction = new Vector(-1, 0), From = new Vector(2, -1), }; Scalar TOI, fraction; var result = ConnectingSegmentvsRay.FindIntersection(edge1, edge2, ray, out TOI, out fraction); CheckEqual(true, result); CheckEqual(2, TOI); CheckEqual(1, fraction); } } }