using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Annulus.DiscreteCollisionDetection; using Azimuth; namespace Annulus.UnitTests.DiscreteCollisionDetection { public class TriangleTriangleTests : UnitTestSharp.TestFixture { public void Disparate() { var triangle1 = new Vector[] { new Vector(0, 0), new Vector(1, 0), new Vector(0, 1), }; var triangle2 = new Vector[] { new Vector(3, 0), new Vector(4, 0), new Vector(3, 1), }; CheckFalse(TriangleTriangle.Intersects(triangle1, triangle2)); CheckFalse(TriangleTriangle.Intersects(triangle2, triangle1)); } public void SmallerTriangleInsideLargerTriangle() { var triangle1 = new Vector[] { new Vector(-1, -1), new Vector(1, -1), new Vector(0, 1), }; var triangle2 = new Vector[] { new Vector(0, -.75), new Vector(-.25, 0), new Vector(.25, 0), }; CheckTrue(TriangleTriangle.Intersects(triangle1, triangle2)); CheckTrue(TriangleTriangle.Intersects(triangle2, triangle1)); } public void SameTriangle() { var triangle1 = new Vector[] { new Vector(-1, -1), new Vector(1, -1), new Vector(0, 1), }; var triangle2 = new Vector[] { new Vector(-1, -1), new Vector(1, -1), new Vector(0, 1), }; CheckTrue(TriangleTriangle.Intersects(triangle1, triangle2)); CheckTrue(TriangleTriangle.Intersects(triangle2, triangle1)); } public void DisparateColinearEdges() { var triangle1 = new Vector[] { new Vector(-1, -1), new Vector(1, -1), new Vector(0, 1), }; var triangle2 = new Vector[] { new Vector(2, -1), new Vector(4, -1), new Vector(2, 1), }; CheckFalse(TriangleTriangle.Intersects(triangle1, triangle2)); CheckFalse(TriangleTriangle.Intersects(triangle2, triangle1)); } public void SimilarEdgeIntersecting() { var triangle1 = new Vector[] { new Vector(-1, -1), new Vector(1, -1), new Vector(0, 1), }; var triangle2 = new Vector[] { new Vector(-1, -1), new Vector(1, -1), new Vector(0, 0), }; CheckTrue(TriangleTriangle.Intersects(triangle1, triangle2)); CheckTrue(TriangleTriangle.Intersects(triangle2, triangle1)); } public void SimilarEdgeGlancing() { var triangle1 = new Vector[] { new Vector(-1, -1), new Vector(1, -1), new Vector(0, 1), }; var triangle2 = new Vector[] { new Vector(-1, -1), new Vector(1, -1), new Vector(0, -1), }; CheckFalse(TriangleTriangle.Intersects(triangle1, triangle2)); CheckFalse(TriangleTriangle.Intersects(triangle2, triangle1)); } public void SharedEdgeIntersecting() { var triangle1 = new Vector[] { new Vector(-1, -1), new Vector(1, -1), new Vector(0, 1), }; var triangle2 = new Vector[] { new Vector(-0.5, -1), new Vector(0.5, -1), new Vector(0, 0), }; CheckTrue(TriangleTriangle.Intersects(triangle1, triangle2)); CheckTrue(TriangleTriangle.Intersects(triangle2, triangle1)); } public void SharedEdgeGlancing() { var triangle1 = new Vector[] { new Vector(-1, -1), new Vector(1, -1), new Vector(0, 1), }; var triangle2 = new Vector[] { new Vector(-0.5, -1), new Vector(0.5, -1), new Vector(0, -1), }; CheckFalse(TriangleTriangle.Intersects(triangle1, triangle2)); CheckFalse(TriangleTriangle.Intersects(triangle2, triangle1)); } public void TwoOverlapingEdges() { var triangle1 = new Vector[] { new Vector(0, 0), new Vector(2, 0), new Vector(0, 1), }; var triangle2 = new Vector[] { new Vector(0, 0), new Vector(1, 0), new Vector(0, 2), }; CheckTrue(TriangleTriangle.Intersects(triangle1, triangle2)); CheckTrue(TriangleTriangle.Intersects(triangle2, triangle1)); } public void OneVertexInsideTheOther() { var triangle1 = new Vector[] { new Vector(-1, 0), new Vector(1, 0), new Vector(0, 1), }; var triangle2 = new Vector[] { new Vector(-1, -2), new Vector(1, -2), new Vector(0, 0.5), }; CheckTrue(TriangleTriangle.Intersects(triangle1, triangle2)); CheckTrue(TriangleTriangle.Intersects(triangle2, triangle1)); } public void EachContainingAVertex() { var triangle1 = new Vector[] { new Vector(-1, 0), new Vector(1, 0), new Vector(0, 1), }; var triangle2 = new Vector[] { new Vector(-1, 2), new Vector(1, 2), new Vector(0, 0.5), }; CheckTrue(TriangleTriangle.Intersects(triangle1, triangle2)); CheckTrue(TriangleTriangle.Intersects(triangle2, triangle1)); } public void Hexagram() { var triangle1 = new Vector[] { new Vector(-1, 0), new Vector(1, 0), new Vector(0, 2), }; var triangle2 = new Vector[] { new Vector(-1, 1), new Vector(1, 1), new Vector(0, -1), }; CheckTrue(TriangleTriangle.Intersects(triangle1, triangle2)); CheckTrue(TriangleTriangle.Intersects(triangle2, triangle1)); } public void OneEdgeInsideTheOther() { var triangle1 = new Vector[] { new Vector(-1, 0), new Vector(1, 0), new Vector(0, 2), }; var triangle2 = new Vector[] { new Vector(-0.1, 0.1), new Vector(0.1, 0.2), new Vector(3, 3), }; CheckTrue(TriangleTriangle.Intersects(triangle1, triangle2)); CheckTrue(TriangleTriangle.Intersects(triangle2, triangle1)); } public void OneEdgeInsideTheOther_OneOtherVertexInside() { var triangle1 = new Vector[] { new Vector(-1, 0), new Vector(1, 0), new Vector(0, 2), }; var triangle2 = new Vector[] { new Vector(-0.1, 0.25), new Vector(0.1, 0.25), new Vector(0, 3), }; CheckTrue(TriangleTriangle.Intersects(triangle1, triangle2)); CheckTrue(TriangleTriangle.Intersects(triangle2, triangle1)); } public void BothDegenerateSamePoint() { var triangle1 = new Vector[] { new Vector(0, 0), new Vector(0, 0), new Vector(0, 0), }; var triangle2 = new Vector[] { new Vector(0, 0), new Vector(0, 0), new Vector(0, 0), }; CheckFalse(TriangleTriangle.Intersects(triangle1, triangle2)); CheckFalse(TriangleTriangle.Intersects(triangle2, triangle1)); } public void BothDegenerateDifferentPoints() { var triangle1 = new Vector[] { new Vector(0, 0), new Vector(0, 0), new Vector(0, 0), }; var triangle2 = new Vector[] { new Vector(1, 1), new Vector(1, 1), new Vector(1, 1), }; CheckFalse(TriangleTriangle.Intersects(triangle1, triangle2)); CheckFalse(TriangleTriangle.Intersects(triangle2, triangle1)); } public void OneDegenerateInsideOther() { var triangle1 = new Vector[] { new Vector(0, 0), new Vector(0, 0), new Vector(0, 0), }; var triangle2 = new Vector[] { new Vector(-1, -1), new Vector(1, -1), new Vector(0, 2), }; CheckTrue(TriangleTriangle.Intersects(triangle1, triangle2)); CheckTrue(TriangleTriangle.Intersects(triangle2, triangle1)); } public void OneFlatInsideOther() { var triangle1 = new Vector[] { new Vector(-.25, -.75), new Vector(0, -.75), new Vector(.25, -.75), }; var triangle2 = new Vector[] { new Vector(-1, -1), new Vector(1, -1), new Vector(0, 2), }; CheckTrue(TriangleTriangle.Intersects(triangle1, triangle2)); CheckTrue(TriangleTriangle.Intersects(triangle2, triangle1)); } public void BothFlatSameLine() { var triangle1 = new Vector[] { new Vector(-.25, -.75), new Vector(0, -.75), new Vector(.25, -.75), }; var triangle2 = new Vector[] { new Vector(-.25, -.75), new Vector(0, -.75), new Vector(.25, -.75), }; CheckFalse(TriangleTriangle.Intersects(triangle1, triangle2)); CheckFalse(TriangleTriangle.Intersects(triangle2, triangle1)); } public void OneFlatOutsideOther() { var triangle1 = new Vector[] { new Vector(-.25, -.75), new Vector(0, -.75), new Vector(.25, -.75), }; var triangle2 = new Vector[] { new Vector(10, 0), new Vector(12, 0), new Vector(11, 1), }; CheckFalse(TriangleTriangle.Intersects(triangle1, triangle2)); CheckFalse(TriangleTriangle.Intersects(triangle2, triangle1)); } public void DegeneratePointOnFlatTriangle() { var triangle1 = new Vector[] { new Vector(-.25, -.75), new Vector(0, -.75), new Vector(.25, -.75), }; var triangle2 = new Vector[] { new Vector(0, -.75), new Vector(0, -.75), new Vector(0, -.75), }; CheckFalse(TriangleTriangle.Intersects(triangle1, triangle2)); CheckFalse(TriangleTriangle.Intersects(triangle2, triangle1)); } } }