using System; using System.Collections.Generic; using System.Linq; using System.Text; using Annulus.DiscreteCollisionDetection; using Azimuth; using UnitTestSharp; namespace Annulus.UnitTests.DiscreteCollisionDetection { class PointToTriangleTests : TestFixture { public class ClosestPointOnTriangleToPoint : UnitTestSharp.TestFixture { public static readonly Vector a = new Vector(0, 1); public static readonly Vector b = new Vector(-1, 0); public static readonly Vector c = new Vector(1, 0); public static readonly Vector abMid = (a + b) / 2; Scalar wA, wB, wC; public void VertexA() { Vector p = a * 10; Vector pPrime = TrianglePoint.ClosestPointOnTriangleToPoint(a, b, c, p, out wA, out wB, out wC); CheckEqual(a, pPrime); CheckEqual(1, wA); CheckEqual(0, wB); CheckEqual(0, wC); } public void VertexB() { Vector p = a * 10; Vector pPrime = TrianglePoint.ClosestPointOnTriangleToPoint(b, a, c, p, out wA, out wB, out wC); CheckEqual(a, pPrime); CheckEqual(0, wA); CheckEqual(1, wB); CheckEqual(0, wC); } public void VertexC() { Vector p = a * 10; Vector pPrime = TrianglePoint.ClosestPointOnTriangleToPoint(c, b, a, p, out wA, out wB, out wC); CheckEqual(a, pPrime); CheckEqual(0, wA); CheckEqual(0, wB); CheckEqual(1, wC); } public void AB() { Vector p = abMid * 10; Vector pPrime = TrianglePoint.ClosestPointOnTriangleToPoint(a, b, c, p, out wA, out wB, out wC); CheckEqual(abMid, pPrime); CheckEqual(0.5, wA); CheckEqual(0.5, wB); CheckEqual(0, wC); } public void BC() { Vector p = abMid * 10; Vector pPrime = TrianglePoint.ClosestPointOnTriangleToPoint(c, b, a, p, out wA, out wB, out wC); CheckEqual(abMid, pPrime); CheckEqual(0, wA); CheckEqual(0.5, wB); CheckEqual(0.5, wC); } public void CA() { Vector p = abMid * 10; Vector pPrime = TrianglePoint.ClosestPointOnTriangleToPoint(a, c, b, p, out wA, out wB, out wC); CheckEqual(abMid, pPrime); CheckEqual(0.5, wA); CheckEqual(0, wB); CheckEqual(0.5, wC); } public void Inside() { Vector p = (a + b + c) / 3; Vector pPrime = TrianglePoint.ClosestPointOnTriangleToPoint(a, b, c, p, out wA, out wB, out wC); CheckEqual(p, pPrime); CheckEqual(1.0 / 3.0, wA); CheckEqual(1.0 / 3.0, wB); CheckEqual(1.0 / 3.0, wC); } public void Degenerate() { Vector p = a * 10; Vector pPrime = TrianglePoint.ClosestPointOnTriangleToPoint(a, a, a, p, out wA, out wB, out wC); CheckEqual(a, pPrime); } public void Colinear() { Vector a = new Vector(-1, 0); Vector b = new Vector(0, 0); Vector c = new Vector(1, 0); Vector p = new Vector(0.5, 10); Vector pPrime = TrianglePoint.ClosestPointOnTriangleToPoint(a, b, c, p, out wA, out wB, out wC); CheckEqual(new Vector(0.5, 0), pPrime); } } public class IsPointInsideTriangle : UnitTestSharp.TestFixture { IList triangle = new Vector[] { new Vector(1, 0), new Vector(0, 1), new Vector(0, 0), }; [IgnoreTest] public void Test(Vector pt, TrianglePoint.Status expected) { CheckEqual(expected, TrianglePoint.IsPointInsideTriangle(triangle[0], triangle[1], triangle[2], pt)); } public void Left() { var pt = new Vector(-1, 0.5); Test(pt, TrianglePoint.Status.Outside); } public void Right() { var pt = new Vector(1, 1); Test(pt, TrianglePoint.Status.Outside); } public void Below() { var pt = new Vector(0.5, -1); Test(pt, TrianglePoint.Status.Outside); } public void TopVertexArea() { var pt = new Vector(-1, 7); Test(pt, TrianglePoint.Status.Outside); } public void BottomVertexArea() { var pt = new Vector(-1, -7); Test(pt, TrianglePoint.Status.Outside); } public void RightVertexArea() { var pt = new Vector(17, 1); Test(pt, TrianglePoint.Status.Outside); } public void Inside() { var pt = new Vector(0.25, 0.25); Test(pt, TrianglePoint.Status.Inside); } public void OnEdge_1() { var pt = new Vector(0.5, 0); Test(pt, TrianglePoint.Status.OnEdge); } public void OnEdge_2() { var pt = new Vector(0.5, 0.5); Test(pt, TrianglePoint.Status.OnEdge); } public void OnEdge_3() { var pt = new Vector(0, 0.5); Test(pt, TrianglePoint.Status.OnEdge); } public void onVertex() { for (int i = 0; i < triangle.Count(); ++i) { Test(triangle[i], TrianglePoint.Status.OnEdge); } } IList colinear = new Vector[] { new Vector(0, 0), new Vector(1, 0), new Vector(2, 0), }; public void Degenerate_Colinear_On() { Test(new Vector(1.5, 0), TrianglePoint.Status.OnEdge); } public void Degenerate_Colinear_Outside() { Test(new Vector(1.5, 1), TrianglePoint.Status.Outside); } IList point = new Vector[] { new Vector(1, 0), new Vector(1, 0), new Vector(1, 0), }; public void SamePoint_On() { Test(new Vector(1, 0), TrianglePoint.Status.OnEdge); } public void SamePoint_Outside() { Test(new Vector(1, 1), TrianglePoint.Status.Outside); } } } }