Dart Documentationbox2dTimeOfImpactSolverManifold

TimeOfImpactSolverManifold class

class TimeOfImpactSolverManifold {
 final Vector2 normal;
 final Vector2 point;
 num separation;

 /** Pooling */
 final Vector2 pointA;
 final Vector2 pointB;
 final Vector2 temp;
 final Vector2 planePoint;
 final Vector2 clipPoint;

 /** constructor that initiliazes everything. */
 TimeOfImpactSolverManifold() :
   normal = new Vector2.zero(),
   point = new Vector2.zero(),
   separation = 0,
   pointA = new Vector2.zero(),
   pointB = new Vector2.zero(),
   temp = new Vector2.zero(),
   planePoint = new Vector2.zero(),
   clipPoint = new Vector2.zero();

 void initialize(TimeOfImpactConstraint cc, int index) {
   assert(cc.pointCount > 0);

   switch (cc.type) {
     case ManifoldType.CIRCLES:
       pointA.setFrom(cc.bodyA.getWorldPoint(cc.localPoint));
       pointB.setFrom(cc.bodyB.getWorldPoint(cc.localPoints[0]));
       if (MathBox.distanceSquared(pointA, pointB) > Settings.EPSILON
           * Settings.EPSILON) {
         normal.setFrom(pointB).sub(pointA);
         normal.normalize();
       } else {
         normal.setValues(1.0, 0.0);
       }

       point.setFrom(pointA).add(pointB).scale(.5);
       temp.setFrom(pointB).sub(pointA);
       separation = temp.dot(normal) - cc.radius;
       break;

     case ManifoldType.FACE_A:
       normal.setFrom(cc.bodyA.getWorldVector2(cc.localNormal));
       planePoint.setFrom(cc.bodyA.getWorldPoint(cc.localPoint));

       clipPoint.setFrom(cc.bodyB.getWorldPoint(cc.localPoints[index]));
       temp.setFrom(clipPoint).sub(planePoint);
       separation = temp.dot(normal) - cc.radius;
       point.setFrom(clipPoint);
       break;

     case ManifoldType.FACE_B:
       normal.setFrom(cc.bodyB.getWorldVector2(cc.localNormal));
       planePoint.setFrom(cc.bodyB.getWorldPoint(cc.localPoint));

       clipPoint.setFrom(cc.bodyA.getWorldPoint(cc.localPoints[index]));
       temp.setFrom(clipPoint).sub(planePoint);
       separation = temp.dot(normal) - cc.radius;
       point.setFrom(clipPoint);

       // Ensure normal points from A to B
       normal.negate();
       break;
   }
 }
}

Constructors

new TimeOfImpactSolverManifold() #

constructor that initiliazes everything.

TimeOfImpactSolverManifold() :
 normal = new Vector2.zero(),
 point = new Vector2.zero(),
 separation = 0,
 pointA = new Vector2.zero(),
 pointB = new Vector2.zero(),
 temp = new Vector2.zero(),
 planePoint = new Vector2.zero(),
 clipPoint = new Vector2.zero();

Properties

final Vector2 clipPoint #

final Vector2 clipPoint

final Vector2 normal #

final Vector2 normal

final Vector2 planePoint #

final Vector2 planePoint

final Vector2 point #

final Vector2 point

final Vector2 pointA #

Pooling

final Vector2 pointA

final Vector2 pointB #

final Vector2 pointB

num separation #

num separation

final Vector2 temp #

final Vector2 temp

Methods

void initialize(TimeOfImpactConstraint cc, int index) #

void initialize(TimeOfImpactConstraint cc, int index) {
 assert(cc.pointCount > 0);

 switch (cc.type) {
   case ManifoldType.CIRCLES:
     pointA.setFrom(cc.bodyA.getWorldPoint(cc.localPoint));
     pointB.setFrom(cc.bodyB.getWorldPoint(cc.localPoints[0]));
     if (MathBox.distanceSquared(pointA, pointB) > Settings.EPSILON
         * Settings.EPSILON) {
       normal.setFrom(pointB).sub(pointA);
       normal.normalize();
     } else {
       normal.setValues(1.0, 0.0);
     }

     point.setFrom(pointA).add(pointB).scale(.5);
     temp.setFrom(pointB).sub(pointA);
     separation = temp.dot(normal) - cc.radius;
     break;

   case ManifoldType.FACE_A:
     normal.setFrom(cc.bodyA.getWorldVector2(cc.localNormal));
     planePoint.setFrom(cc.bodyA.getWorldPoint(cc.localPoint));

     clipPoint.setFrom(cc.bodyB.getWorldPoint(cc.localPoints[index]));
     temp.setFrom(clipPoint).sub(planePoint);
     separation = temp.dot(normal) - cc.radius;
     point.setFrom(clipPoint);
     break;

   case ManifoldType.FACE_B:
     normal.setFrom(cc.bodyB.getWorldVector2(cc.localNormal));
     planePoint.setFrom(cc.bodyB.getWorldPoint(cc.localPoint));

     clipPoint.setFrom(cc.bodyA.getWorldPoint(cc.localPoints[index]));
     temp.setFrom(clipPoint).sub(planePoint);
     separation = temp.dot(normal) - cc.radius;
     point.setFrom(clipPoint);

     // Ensure normal points from A to B
     normal.negate();
     break;
 }
}