公式2:
/* bounce(mtv, shapeMoving, shape);*/
function bounce(mtv, collider, collidee) {
var dotProductRatio, vdotl, ldotl, point,
velocityVector = new Vector(new Point(velocity.x, velocity.y)),
velocityUnitVector = velocityVector.normalize(),/*单位向量*/
velocityVectorMagnitude = velocityVector.getMagnitude(),/*求模*/
perpendicular;
if (shapeMoving) {
checkMTVAxisDirection(mtv, collider, collidee)
point = new Point();
if (mtv.axis !== undefined) {
// perpendicular = mtv.axis;/*最小重叠投影的边向量*/
perpendicular = mtv.axis.perpendicular();
}
else {
perpendicular = new Vector(new Point(-velocityUnitVector.y,
velocityUnitVector.x));
}
vdotl = velocityUnitVector.dotProduct(perpendicular);
ldotl = perpendicular.dotProduct(perpendicular);
dotProductRatio = vdotl / ldotl;
point.x = 2 * dotProductRatio * perpendicular.x - velocityUnitVector.x;
point.y = 2 * dotProductRatio * perpendicular.y - velocityUnitVector.y;
/*此处注释是利用公式:R=V-2(V`L)`L*/
// var vl = velocityUnitVector.dotProduct(perpendicular)*2;
// var vll = perpendicular.changshuji(vl);
/*注释changshuji在vector里的方法
changshuji:function(C){
var v = new Vector();
v.x = this.x*C;
v.y = this.y*C;
return v;
},*/
// var r = velocityUnitVector.subtract(vll);
// point.x = r.x;
// point.y = r.y;
separate(mtv);
velocity.x = point.x * velocityVectorMagnitude;
velocity.y = point.y * velocityVectorMagnitude;
}
}