Dart Documentationbox2dTimeOfImpactSolverManifold

TimeOfImpactSolverManifold class

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

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

 /** constructor that initiliazes everything. */
 TimeOfImpactSolverManifold() :
   normal = new Vector(),
   point = new Vector(),
   separation = 0,
   pointA = new Vector(),
   pointB = new Vector(),
   temp = new Vector(),
   planePoint = new Vector(),
   clipPoint = new Vector() { }

 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).subLocal(pointA);
         normal.normalize();
       } else {
         normal.setCoords(1, 0);
       }

       point.setFrom(pointA).addLocal(pointB).mulLocal(.5);
       temp.setFrom(pointB).subLocal(pointA);
       separation = Vector.dot(temp, normal) - cc.radius;
       break;

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

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

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

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

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

Constructors

new TimeOfImpactSolverManifold() #

constructor that initiliazes everything.

TimeOfImpactSolverManifold() :
 normal = new Vector(),
 point = new Vector(),
 separation = 0,
 pointA = new Vector(),
 pointB = new Vector(),
 temp = new Vector(),
 planePoint = new Vector(),
 clipPoint = new Vector() { }

Properties

final Vector clipPoint #

final Vector clipPoint

final Vector normal #

final Vector normal

final Vector planePoint #

final Vector planePoint

final Vector point #

final Vector point

final Vector pointA #

Pooling

final Vector pointA

final Vector pointB #

final Vector pointB

num separation #

num separation

final Vector temp #

final Vector 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).subLocal(pointA);
       normal.normalize();
     } else {
       normal.setCoords(1, 0);
     }

     point.setFrom(pointA).addLocal(pointB).mulLocal(.5);
     temp.setFrom(pointB).subLocal(pointA);
     separation = Vector.dot(temp, normal) - cc.radius;
     break;

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

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

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

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

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