圆旋转矩形碰撞检测

时间:2012-11-27 08:39:55

标签: html5-canvas collision-detection

我正在尝试按照此http://www.migapro.com/circle-and-rotated-rectangle-collision-detection/

实现旋转的矩形和圆之间的碰撞检测

我在jsfiddle中添加了代码http://jsfiddle.net/Z6KSX/2/

我在这里缺少什么?

function check_coll ( circle_x,circle_y, rect_x, rect_y, rect_width, rect_height, rect_angle) 
   {

    // Rotate circle's center point back
    var rect_centerX = rect_x /2 ;
    var rect_centerY = rect_y /2 ;

    var cx = (Math.cos(rect_angle) * (circle_x - rect_centerX)) - (Math.sin(rect_angle) * (circle_y - rect_centerY)) + rect_centerX;
    var cy = (Math.sin(rect_angle) * (circle_x - rect_centerX)) + (Math.cos(rect_angle) * (circle_y - rect_centerY)) + rect_centerY;

    // Closest point
    var x, y;

    // Find the unrotated closest x point from center of unrotated circle
    if (cx < rect_x) {
        x = rect_x;
    }
    else if (cx > rect_x + rect_width){
        x = rect_x + rect_width;
    }
    else{
        x = cx;
     }

    // Find the unrotated closest y point from center of unrotated circle
    if (cy < rect_y){
        y = rect_y;
    }
    else if (cy > rect_y + rect_height) {
        y = rect_y + rect_height;
    }
    else {
        y = cy;
     }
    // Determine collision
    var collision = false;

    var c_radius = 5;
    var distance = findDistance(cx, cy, x, y);

    if (distance < c_radius) {
        collision = true; // Collision
    }
    else {
        collision = false;
    }
     return collision;
}


function findDistance (x1, y1, x2, y2) {
       var a = Math.abs(x1 - x2);
       var b = Math.abs(y1 - y2);

       var c = Math.sqrt((a * a) + (b * b));
       return c;
}

function check_coll ( circle_x,circle_y, rect_x, rect_y, rect_width, rect_height, rect_angle) { // Rotate circle's center point back var rect_centerX = rect_x /2 ; var rect_centerY = rect_y /2 ; var cx = (Math.cos(rect_angle) * (circle_x - rect_centerX)) - (Math.sin(rect_angle) * (circle_y - rect_centerY)) + rect_centerX; var cy = (Math.sin(rect_angle) * (circle_x - rect_centerX)) + (Math.cos(rect_angle) * (circle_y - rect_centerY)) + rect_centerY; // Closest point var x, y; // Find the unrotated closest x point from center of unrotated circle if (cx < rect_x) { x = rect_x; } else if (cx > rect_x + rect_width){ x = rect_x + rect_width; } else{ x = cx; } // Find the unrotated closest y point from center of unrotated circle if (cy < rect_y){ y = rect_y; } else if (cy > rect_y + rect_height) { y = rect_y + rect_height; } else { y = cy; } // Determine collision var collision = false; var c_radius = 5; var distance = findDistance(cx, cy, x, y); if (distance < c_radius) { collision = true; // Collision } else { collision = false; } return collision; } function findDistance (x1, y1, x2, y2) { var a = Math.abs(x1 - x2); var b = Math.abs(y1 - y2); var c = Math.sqrt((a * a) + (b * b)); return c; }

2 个答案:

答案 0 :(得分:1)

呵呵,我觉得这很有意思,因为我花了很多时间走错了路,最近才解决了这个问题。

最终我想出了办法:

1。)只需将圆心的点旋转矩形旋转的负数即可。现在,该点与矩形“对齐”(在矩形相对坐标空间中)。

2。)解决圆圈与AABB的问题。我解决它的方式给了我一个最接近圆圈中心的矩形点。

3。)从矩形旋转的正数量旋转结果点。像往常一样继续解决(检查该点与圆心之间的距离是否在圆的半径范围内)

从很快的一瞥你的代码,似乎你可能正在做同样的事情,但错过了最后一步?我建议从第2步开始在矩形上绘制你的观点,看看它确实在哪里帮助调试。

答案 1 :(得分:0)

我能够弄清楚这一点。代码中的问题是,我使用了错误的半径而错过了rect_x和rect_y的中心

   var rect_centerX = rect_x + (rect_width / 2);
   var rect_centerY = rect_y + (rect_height /2);

在画布上处理旋转时,我们需要将translate值添加到createrect中使用的相应x和y值。