using System; using System.Collections.Generic; using System.Linq; using System.Text; using Azimuth; using Lodestone; using UnitTestSharp; namespace Lodestone.UnitTests.DiscreteCollisionDetection { class PointToTriangle : 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 = Lodestone.DiscreteCollisionDetection.PointToTriangle.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 = Lodestone.DiscreteCollisionDetection.PointToTriangle.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 = Lodestone.DiscreteCollisionDetection.PointToTriangle.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 = Lodestone.DiscreteCollisionDetection.PointToTriangle.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 = Lodestone.DiscreteCollisionDetection.PointToTriangle.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 = Lodestone.DiscreteCollisionDetection.PointToTriangle.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 = Lodestone.DiscreteCollisionDetection.PointToTriangle.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 = Lodestone.DiscreteCollisionDetection.PointToTriangle.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 = Lodestone.DiscreteCollisionDetection.PointToTriangle.ClosestPointOnTriangleToPoint(a, b, c, p, out wA, out wB, out wC); CheckEqual(new Vector(0.5, 0), pPrime); } } }