Ejemplo n.º 1
0
        internal void ReadCache(ref SimplexCache cache, DistanceProxy proxyA, ref Transform transformA, DistanceProxy proxyB, ref Transform transformB)
        {
            Debug.Assert(cache.Count <= 3);

            // Copy data from cache.
            Count = cache.Count;
            for (int i = 0; i < Count; ++i)
            {
                SimplexVertex v = V[i];
                v.IndexA = cache.IndexA[i];
                v.IndexB = cache.IndexB[i];
                TSVector2 wALocal = proxyA.Vertices[v.IndexA];
                TSVector2 wBLocal = proxyB.Vertices[v.IndexB];
                v.WA = MathUtils.Mul(ref transformA, wALocal);
                v.WB = MathUtils.Mul(ref transformB, wBLocal);
                v.W  = v.WB - v.WA;
                v.A  = 0.0f;
                V[i] = v;
            }

            // Compute the new simplex metric, if it is substantially different than
            // old metric then flush the simplex.
            if (Count > 1)
            {
                FP metric1 = cache.Metric;
                FP metric2 = GetMetric();
                if (metric2 < 0.5f * metric1 || 2.0f * metric1 < metric2 || metric2 < Settings.Epsilon)
                {
                    // Reset the simplex.
                    Count = 0;
                }
            }

            // If the cache is empty or invalid ...
            if (Count == 0)
            {
                SimplexVertex v = V[0];
                v.IndexA = 0;
                v.IndexB = 0;
                TSVector2 wALocal = proxyA.Vertices[0];
                TSVector2 wBLocal = proxyB.Vertices[0];
                v.WA  = MathUtils.Mul(ref transformA, wALocal);
                v.WB  = MathUtils.Mul(ref transformB, wBLocal);
                v.W   = v.WB - v.WA;
                v.A   = 1.0f;
                V[0]  = v;
                Count = 1;
            }
        }
Ejemplo n.º 2
0
        public static void Set(ref SimplexCache cache, DistanceProxy proxyA, ref Sweep sweepA, DistanceProxy proxyB, ref Sweep sweepB, FP t1)
        {
            _localPoint = TSVector2.zero;
            _proxyA     = proxyA;
            _proxyB     = proxyB;
            int count = cache.Count;

            Debug.Assert(0 < count && count < 3);

            _sweepA = sweepA;
            _sweepB = sweepB;

            Transform xfA, xfB;

            _sweepA.GetTransform(out xfA, t1);
            _sweepB.GetTransform(out xfB, t1);

            if (count == 1)
            {
                _type = SeparationFunctionType.Points;
                TSVector2 localPointA = _proxyA.Vertices[cache.IndexA[0]];
                TSVector2 localPointB = _proxyB.Vertices[cache.IndexB[0]];
                TSVector2 pointA      = MathUtils.Mul(ref xfA, localPointA);
                TSVector2 pointB      = MathUtils.Mul(ref xfB, localPointB);
                _axis = pointB - pointA;
                _axis.Normalize();
            }
            else if (cache.IndexA[0] == cache.IndexA[1])
            {
                // Two points on B and one on A.
                _type = SeparationFunctionType.FaceB;
                TSVector2 localPointB1 = proxyB.Vertices[cache.IndexB[0]];
                TSVector2 localPointB2 = proxyB.Vertices[cache.IndexB[1]];

                TSVector2 a = localPointB2 - localPointB1;
                _axis = new TSVector2(a.y, -a.x);
                _axis.Normalize();
                TSVector2 normal = MathUtils.Mul(ref xfB.q, _axis);

                _localPoint = 0.5f * (localPointB1 + localPointB2);
                TSVector2 pointB = MathUtils.Mul(ref xfB, _localPoint);

                TSVector2 localPointA = proxyA.Vertices[cache.IndexA[0]];
                TSVector2 pointA      = MathUtils.Mul(ref xfA, localPointA);

                FP s = TSVector2.Dot(pointA - pointB, normal);
                if (s < 0.0f)
                {
                    _axis = -_axis;
                }
            }
            else
            {
                // Two points on A and one or two points on B.
                _type = SeparationFunctionType.FaceA;
                TSVector2 localPointA1 = _proxyA.Vertices[cache.IndexA[0]];
                TSVector2 localPointA2 = _proxyA.Vertices[cache.IndexA[1]];

                TSVector2 a = localPointA2 - localPointA1;
                _axis = new TSVector2(a.y, -a.x);
                _axis.Normalize();
                TSVector2 normal = MathUtils.Mul(ref xfA.q, _axis);

                _localPoint = 0.5f * (localPointA1 + localPointA2);
                TSVector2 pointA = MathUtils.Mul(ref xfA, _localPoint);

                TSVector2 localPointB = _proxyB.Vertices[cache.IndexB[0]];
                TSVector2 pointB      = MathUtils.Mul(ref xfB, localPointB);

                FP s = TSVector2.Dot(pointB - pointA, normal);
                if (s < 0.0f)
                {
                    _axis = -_axis;
                }
            }

            //FPE note: the returned value that used to be here has been removed, as it was not used.
        }