分离轴定理
碰撞检测
HTML
请拖动下面的物体,观察碰撞效果:
<canvas id="mycanvas"></canvas>
CSS
canvas {
border: 1px solid #000;
}
JavaScript
// 分离轴检测
(function(global, doc) {
var inherit, extend, Vector, Projection,
Shape, Polygon, Point, Circle, Line,
getPolygonPointClosestToCircle, polygonCollidesWithCircle,
polygonCollidesWithPolygon, circleCollidesWithCircle,
shapeCollideswithLine;
// 对象扩展................................
extend = function extend(target, obj) {
var prop, val;
if (!Array.isArray(obj)) {
for (prop in obj) {
val = obj[prop];
if (typeof val === 'object') {
target[prop] = Array.isArray(val) ? [] : {};
extend(target[prop], val);
} else {
target[prop] = val;
}
}
} else {
for (prop = 0; prop < obj.length; prop++) {
val = obj[prop];
if (typeof val === 'object') {
target[prop] = Array.isArray(val) ? [] : {};
extend(target[prop], val);
} else {
target[prop] = val;
}
}
}
};
// 原型继承.................................
inherit = function(Child, Parent) {
var Temp = function() {
this.constructor = Child;
};
Temp.prototype = Parent.prototype;
Child.prototype = new Temp();
};
// 获取多边形上最靠近圆形的点...................
getPolygonPointClosestToCircle = function(polygon, circle) {
var min = Infinity,
closestPoint, length;
polygon.points.forEach(function(point) {
length = Math.pow(circle.x - point.x, 2) + Math.pow(circle.y - point.y, 2);
if (length < min) {
min = length;
closestPoint = point;
}
});
return closestPoint;
};
// 圆形碰撞圆形...........................................
circleCollidesWithCircle = function(c1, c2) {
var distace =...