Esempio n. 1
0
            public bool Set(ref Face f, Gjk.MinkowskiVertice a, Gjk.MinkowskiVertice b, Gjk.MinkowskiVertice c)
            {
                Vector3 nrm   = Vector3.Cross(b.Vertice - a.Vertice, c.Vertice - a.Vertice);
                float   len   = nrm.Length();
                bool    valid = (Vector3.Dot(Vector3.Cross(a.Vertice, b.Vertice), nrm) >= -_epaInFaceEpsilon &&
                                 Vector3.Dot(Vector3.Cross(b.Vertice, c.Vertice), nrm) >= -_epaInFaceEpsilon &&
                                 Vector3.Dot(Vector3.Cross(c.Vertice, a.Vertice), nrm) >= -_epaInFaceEpsilon);

                f._vertices[0] = a;
                f._vertices[1] = b;
                f._vertices[2] = c;
                f._mark        = 0;
                f._n           = nrm / (len > 0 ? len : _infinity);
                f._d           = Max(0, -Vector3.Dot(f._n, a.Vertice));
                return(valid);
            }
Esempio n. 2
0
            public Face NewFace(Gjk.MinkowskiVertice a, Gjk.MinkowskiVertice b, Gjk.MinkowskiVertice c)
            {
                Face pf = new Face();

                if (Set(ref pf, a, b, c))
                {
                    if (_root != null)
                    {
                        _root._prev = pf;
                    }
                    pf._prev = null;
                    pf._next = _root;
                    _root    = pf;
                    ++_nfaces;
                }
                else
                {
                    pf._prev = pf._next = null;
                }
                return(pf);
            }