分离轴定理

碰撞检测

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 =...