Beispiel #1
0
 /// <seealso cref="Joint.getReactionForce(float, Vec2)"></seealso>
 public override void getReactionForce(float inv_dt, Vec2 argOut)
 {
     argOut.set_Renamed(m_impulse.x, m_impulse.y);
     argOut.mulLocal(inv_dt);
 }
Beispiel #2
0
        public void computeCentroidToOut(Vec2[] vs, int count, Vec2 out_Renamed)
        {
            Debug.Assert(count >= 3);

            out_Renamed.set_Renamed(0.0f, 0.0f);
            float area = 0.0f;

            // pRef is the reference point for forming triangles.
            // It's location doesn't change the result (except for rounding error).
            Vec2 pRef = pool1;
            pRef.setZero();

            Vec2 e1 = pool2;
            Vec2 e2 = pool3;

            float inv3 = 1.0f / 3.0f;

            for (int i = 0; i < count; ++i)
            {
                // Triangle vertices.
                Vec2 p1 = pRef;
                Vec2 p2 = vs[i];
                Vec2 p3 = i + 1 < count ? vs[i + 1] : vs[0];

                e1.set_Renamed(p2).subLocal(p1);
                e2.set_Renamed(p3).subLocal(p1);

                float D = Vec2.cross(e1, e2);

                float triangleArea = 0.5f * D;
                area += triangleArea;

                // Area weighted centroid
                e1.set_Renamed(p1).addLocal(p2).addLocal(p3).mulLocal(triangleArea * inv3);
                out_Renamed.addLocal(e1);
            }

            // Centroid
            Debug.Assert(area > Settings.EPSILON);
            out_Renamed.mulLocal(1.0f / area);
        }