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);
        }
Example #11
0
        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);
        }
Example #12
0
        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);
        }