public void CoplanarAndSeparated() { var tA = new Triangle(new Vector3(10, 0, -10), new Vector3(-10, 0, -10), new Vector3(0, 0, 10)); var tB = new Triangle(new Vector3(10, 0, 20), new Vector3(-10, 0, 20), new Vector3(0, 0, 40)); for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) { Vector3 p, n; float d; bool haveContact = TriangleTriangleAlgorithm.GetContact(ref tA, ref tB, out p, out n, out d); Assert.AreEqual(false, haveContact); // "Rotate" triangle to test next edges. var oldB = tB; tB[0] = oldB[1]; tB[1] = oldB[2]; tB[2] = oldB[0]; } // "Rotate" triangle to test next edges. var oldA = tA; tA[0] = oldA[1]; tA[1] = oldA[2]; tA[2] = oldA[0]; } MathHelper.Swap(ref tA, ref tB); } }
public void BothFacesDegenerate() { var tA = new Triangle(new Vector3(-10, 0, 0), new Vector3(-10, 0, 0), new Vector3(10, 0, 0)); var tB = new Triangle(new Vector3(0, 0, -10), new Vector3(0, 0, 10), new Vector3(0, 0, 10)); Vector3 p, n; float d; bool haveContact = TriangleTriangleAlgorithm.GetContact(ref tA, ref tB, out p, out n, out d); Assert.AreEqual(false, haveContact); }
public void SeparationEdgeA2EdgeB2_1() { var tA = new Triangle(new Vector3(0, 0, -10), new Vector3(-10, 0, 0), new Vector3(0, 0, 10)); var tB = new Triangle(new Vector3(1, 10, 0), new Vector3(10, 0, 0), new Vector3(1, -10, 0)); Vector3 p, n; float d; bool haveContact = TriangleTriangleAlgorithm.GetContact(ref tA, ref tB, out p, out n, out d); Assert.AreEqual(false, haveContact); }
public void Test0() { var tta = new TriangleTriangleAlgorithm(new CollisionDetection()); int numberOfContacts = 0; int numberOfTests = 10000; RandomHelper.Random = new Random(1234567); for (int i = 0; i < numberOfTests; i++) { // Create two triangles. var tA = new Triangle(); tA.Vertex0 = new Vector3(RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100)); tA.Vertex1 = new Vector3(RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100)); tA.Vertex2 = new Vector3(RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100)); var tB = new Triangle(); tB.Vertex0 = new Vector3(RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100)); tB.Vertex1 = new Vector3(RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100)); tB.Vertex2 = new Vector3(RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100)); var ttTest = GeometryHelper.HaveContact(tA, tB); if (ttTest) { numberOfContacts++; } var coA = new CollisionObject(new GeometricObject(new TriangleShape(tA))); var coB = new CollisionObject(new GeometricObject(new TriangleShape(tB))); var cs = tta.GetContacts(coA, coB); Assert.AreEqual(ttTest, cs.HaveContact); if (cs.HaveContact) { Assert.AreEqual(1, cs.Count); var epsilon = 0.01f; if (!GeometryHelper.IsOver(tA, cs[0].PositionAWorld, epsilon)) { Debugger.Break(); } if (!GeometryHelper.IsOver(tB, cs[0].PositionBWorld, epsilon)) { Debugger.Break(); } Assert.IsTrue(GeometryHelper.IsOver(tA, cs[0].PositionAWorld, epsilon)); Assert.IsTrue(GeometryHelper.IsOver(tB, cs[0].PositionBWorld, epsilon)); } } //Trace.WriteLine("% hits:" + 100f * numberOfContacts / numberOfTests); }
public void PointPoint() { var a = new Vector3(1, 1, 1); var tA = new Triangle(a, a, a); var tB = new Triangle(a, a, a); Vector3 p, n; float d; bool haveContact = TriangleTriangleAlgorithm.GetContact(ref tA, ref tB, out p, out n, out d); Assert.AreEqual(false, haveContact); }
public void CoplanarAndEdge() { var tA = new Triangle(new Vector3(10, 0, -10), new Vector3(-10, 0, -10), new Vector3(0, 0, 0)); var tB = new Triangle(new Vector3(10, 0, -1), new Vector3(-10, 0, -1), new Vector3(10, 0, -2)); for (int a = 0; a < 2; a++) { for (int b = 0; b < 2; b++) { for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) { Vector3 p, n; float d; bool haveContact = TriangleTriangleAlgorithm.GetContact(ref tA, ref tB, out p, out n, out d); Assert.AreEqual(true, haveContact); Assert.IsTrue(Vector3.AreNumericallyEqual(new Vector3(0, 1, 0), n) || Vector3.AreNumericallyEqual(new Vector3(0, -1, 0), n)); Assert.IsTrue(GeometryHelper.IsOver(tA, p, 0.00001f)); Assert.IsTrue(GeometryHelper.IsOver(tB, p, 0.00001f)); //Assert.IsTrue(Vector3.AreNumericallyEqual(?, p)); Assert.AreEqual(0, d); // "Rotate" triangle to test next edges. var oldB = tB; tB[0] = oldB[1]; tB[1] = oldB[2]; tB[2] = oldB[0]; } // "Rotate" triangle to test next edges. var oldA = tA; tA[0] = oldA[1]; tA[1] = oldA[2]; tA[2] = oldA[0]; } MathHelper.Swap(ref tA, ref tB); } // Change winding order. MathHelper.Swap(ref tB.Vertex0, ref tB.Vertex1); } // Change winding order. MathHelper.Swap(ref tA.Vertex0, ref tA.Vertex1); } }
public void VertexA0VertexB0() { var tA = new Triangle(new Vector3(10, 0, -10), new Vector3(-10, 0, -10), new Vector3(0, 0, 10)); var tB = new Triangle(new Vector3(10, 0, -10), new Vector3(10, 10, 0), new Vector3(-10, 10, 0)); Vector3 p, n; float d; bool haveContact = TriangleTriangleAlgorithm.GetContact(ref tA, ref tB, out p, out n, out d); Assert.AreEqual(true, haveContact); Assert.IsTrue(Vector3.AreNumericallyEqual(tA.Vertex0, p)); Assert.IsTrue(Numeric.AreEqual(0, d)); }
public void FaceBDegenerate() { var tB = new Triangle(new Vector3(-1, 0, 0), new Vector3(10, 0, -0), new Vector3(10, 0, 0)); var tA = new Triangle(new Vector3(0, -10, -10), new Vector3(0, -10, 10), new Vector3(0, 10, 0)); Vector3 p, n; float d; bool haveContact = TriangleTriangleAlgorithm.GetContact(ref tA, ref tB, out p, out n, out d); Assert.AreEqual(true, haveContact); Assert.IsTrue(Vector3.AreNumericallyEqual(new Vector3(-0.5f, 0, 0), p)); Assert.IsTrue(Vector3.AreNumericallyEqual(new Vector3(1, 0, 0), n)); Assert.IsTrue(Numeric.AreEqual(1, d)); }
public void FaceEdge() { var tA = new Triangle(new Vector3(10, 0, -10), new Vector3(-10, 0, -10), new Vector3(0, 0, 10)); var tB = new Triangle(new Vector3(-10, -1, 0), new Vector3(10, -1, 0), new Vector3(0, 10, 0)); for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) { Vector3 p, n; float d; bool haveContact = TriangleTriangleAlgorithm.GetContact(ref tA, ref tB, out p, out n, out d); Assert.AreEqual(true, haveContact); Assert.IsTrue(Vector3.AreNumericallyEqual(new Vector3(-5, -0.5f, 0), p) || Vector3.AreNumericallyEqual(new Vector3(5, -0.5f, 0), p)); Assert.IsTrue(GeometryHelper.IsOver(tB, p)); if (i == 0) { Assert.IsTrue(Vector3.AreNumericallyEqual(new Vector3(0, 1, 0), n)); } else { Assert.IsTrue(Vector3.AreNumericallyEqual(new Vector3(0, -1, 0), n)); } Assert.IsTrue(Numeric.AreEqual(1, d)); // "Rotate" triangle to test next edges. var oldB = tB; tB[0] = oldB[1]; tB[1] = oldB[2]; tB[2] = oldB[0]; } // "Rotate" triangle to test next edges. var oldA = tA; tA[0] = oldA[1]; tA[1] = oldA[2]; tA[2] = oldA[0]; } MathHelper.Swap(ref tA, ref tB); } }
public void TestCoplanar() { var tta = new TriangleTriangleAlgorithm(new CollisionDetection()); var gjk = new Gjk(new CollisionDetection()); int numberOfContacts = 0; int numberOfTests = 1000; RandomHelper.Random = new Random(1234567); for (int i = 0; i < numberOfTests; i++) { // Create two triangles. var tA = new Triangle(); tA.Vertex0 = new Vector3(RandomHelper.Random.NextFloat(-100, 100), -290, RandomHelper.Random.NextFloat(-100, 100)); tA.Vertex1 = new Vector3(RandomHelper.Random.NextFloat(-100, 100), -290, RandomHelper.Random.NextFloat(-100, 100)); tA.Vertex2 = new Vector3(RandomHelper.Random.NextFloat(-100, 100), -290, RandomHelper.Random.NextFloat(-100, 100)); var tB = new Triangle(); tB.Vertex0 = new Vector3(RandomHelper.Random.NextFloat(-100, 100), -290, RandomHelper.Random.NextFloat(-100, 100)); tB.Vertex1 = new Vector3(RandomHelper.Random.NextFloat(-100, 100), -290, RandomHelper.Random.NextFloat(-100, 100)); tB.Vertex2 = new Vector3(RandomHelper.Random.NextFloat(-100, 100), -290, RandomHelper.Random.NextFloat(-100, 100)); var ttTest = GeometryHelper.HaveContact(tA, tB); if (ttTest) { numberOfContacts++; } var coA = new CollisionObject(new GeometricObject(new TriangleShape(tA))); var coB = new CollisionObject(new GeometricObject(new TriangleShape(tB))); var csTta = tta.GetContacts(coA, coB); var csGjk = gjk.GetClosestPoints(coA, coB); if (csTta.HaveContact != csGjk.HaveContact) { Trace.WriteLine("Test failed: " + i + " GJK: " + csGjk.HaveContact + " TTA: " + csTta); } Assert.AreEqual(ttTest, csGjk.HaveContact); Assert.AreEqual(ttTest, csTta.HaveContact); } //Trace.WriteLine("% hits:" + 100f * numberOfContacts / numberOfTests); }
public void TestCoplanar() { var tta = new TriangleTriangleAlgorithm(new CollisionDetection()); var gjk = new Gjk(new CollisionDetection()); int numberOfContacts = 0; int numberOfTests = 1000; RandomHelper.Random = new Random(1234567); for (int i = 0; i < numberOfTests; i++) { // Create two triangles. var tA = new Triangle(); tA.Vertex0 = new Vector3F(RandomHelper.Random.NextFloat(-100, 100), -290, RandomHelper.Random.NextFloat(-100, 100)); tA.Vertex1 = new Vector3F(RandomHelper.Random.NextFloat(-100, 100), -290, RandomHelper.Random.NextFloat(-100, 100)); tA.Vertex2 = new Vector3F(RandomHelper.Random.NextFloat(-100, 100), -290, RandomHelper.Random.NextFloat(-100, 100)); var tB = new Triangle(); tB.Vertex0 = new Vector3F(RandomHelper.Random.NextFloat(-100, 100), -290, RandomHelper.Random.NextFloat(-100, 100)); tB.Vertex1 = new Vector3F(RandomHelper.Random.NextFloat(-100, 100), -290, RandomHelper.Random.NextFloat(-100, 100)); tB.Vertex2 = new Vector3F(RandomHelper.Random.NextFloat(-100, 100), -290, RandomHelper.Random.NextFloat(-100, 100)); var ttTest = GeometryHelper.HaveContact(tA, tB); if (ttTest) numberOfContacts++; var coA = new CollisionObject(new GeometricObject(new TriangleShape(tA))); var coB = new CollisionObject(new GeometricObject(new TriangleShape(tB))); var csTta = tta.GetContacts(coA, coB); var csGjk = gjk.GetClosestPoints(coA, coB); if (csTta.HaveContact != csGjk.HaveContact) Trace.WriteLine("Test failed: " + i + " GJK: " + csGjk.HaveContact + " TTA: " + csTta); Assert.AreEqual(ttTest, csGjk.HaveContact); Assert.AreEqual(ttTest, csTta.HaveContact); } //Trace.WriteLine("% hits:" + 100f * numberOfContacts / numberOfTests); }
public void Test0() { var tta = new TriangleTriangleAlgorithm(new CollisionDetection()); int numberOfContacts = 0; int numberOfTests = 10000; RandomHelper.Random = new Random(1234567); for (int i = 0; i < numberOfTests; i++) { // Create two triangles. var tA = new Triangle(); tA.Vertex0 = new Vector3F(RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100)); tA.Vertex1 = new Vector3F(RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100)); tA.Vertex2 = new Vector3F(RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100)); var tB = new Triangle(); tB.Vertex0 = new Vector3F(RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100)); tB.Vertex1 = new Vector3F(RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100)); tB.Vertex2 = new Vector3F(RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100), RandomHelper.Random.NextFloat(-100, 100)); var ttTest = GeometryHelper.HaveContact(tA, tB); if (ttTest) numberOfContacts++; var coA = new CollisionObject(new GeometricObject(new TriangleShape(tA))); var coB = new CollisionObject(new GeometricObject(new TriangleShape(tB))); var cs = tta.GetContacts(coA, coB); Assert.AreEqual(ttTest, cs.HaveContact); if (cs.HaveContact) { Assert.AreEqual(1, cs.Count); var epsilon = 0.01f; if (!GeometryHelper.IsOver(tA, cs[0].PositionAWorld, epsilon)) Debugger.Break(); if (!GeometryHelper.IsOver(tB, cs[0].PositionBWorld, epsilon)) Debugger.Break(); Assert.IsTrue(GeometryHelper.IsOver(tA, cs[0].PositionAWorld, epsilon)); Assert.IsTrue(GeometryHelper.IsOver(tB, cs[0].PositionBWorld, epsilon)); } } //Trace.WriteLine("% hits:" + 100f * numberOfContacts / numberOfTests); }