检测圆-矩形碰撞并非易事(但也没有那么复杂)。
@kuroi neko 的解决方案是正确的,并且与代码一样简单。
幸运的是,您无需完全理解数学理论即可使用命中测试功能。
如果您确实想了解有关该函数如何工作的更多详细信息,这里有一个描述,使用 4 个步骤来测试圆形和矩形是否发生碰撞:
演示:http://jsfiddle.net/m1erickson/n6U8D/
首先,定义一个圆和一个矩形
var circle={x:100,y:290,r:10};
var rect={x:100,y:100,w:40,h:100};
步骤#1:找出圆心和矩形中心之间的垂直和水平(distX/distY)距离
var distX = Math.abs(circle.x - rect.x-rect.w/2);
var distY = Math.abs(circle.y - rect.y-rect.h/2);
步骤#2:如果距离大于halfCircle + halfRect,那么它们相距太远而不会发生碰撞
if (distX > (rect.w/2 + circle.r)) { return false; }
if (distY > (rect.h/2 + circle.r)) { return false; }
步骤#3:如果距离小于halfRect,那么它们肯定会发生碰撞
if (distX <= (rect.w/2)) { return true; }
if (distY <= (rect.h/2)) { return true; }
步骤#4:测试矩形角的碰撞。
- 想想从矩形中心到任何矩形角的线
- 现在将该线延长圆的半径
- 如果圆的中心在该直线上,则它们恰好在该矩形角处发生碰撞
使用毕达哥拉斯公式比较圆心和矩形中心的距离。
var dx=distX-rect.w/2;
var dy=distY-rect.h/2;
return (dx*dx+dy*dy<=(circle.r*circle.r));
完整代码如下:
var circle={x:100,y:290,r:10};
var rect={x:100,y:100,w:40,h:100};
// return true if the rectangle and circle are colliding
function RectCircleColliding(circle,rect){
var distX = Math.abs(circle.x - rect.x-rect.w/2);
var distY = Math.abs(circle.y - rect.y-rect.h/2);
if (distX > (rect.w/2 + circle.r)) { return false; }
if (distY > (rect.h/2 + circle.r)) { return false; }
if (distX <= (rect.w/2)) { return true; }
if (distY <= (rect.h/2)) { return true; }
var dx=distX-rect.w/2;
var dy=distY-rect.h/2;
return (dx*dx+dy*dy<=(circle.r*circle.r));
}