检测圆矩形的碰撞是不平凡的(但没有那么复杂要么)。
@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 /二STY)圆的中心与矩形的中心
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));
}
我知道这个解决方案很不错,,,我已经看到了小提琴文件,真正感谢那个家伙@markE ,,但实际上我刚开始HTML5的Canvas ,,它不那么强硬码,,,但都不我需要,,,我竟然有一种类型的乒乓游戏的地方,我必须圆(桨)和矩形(OBJ作为球),那它..之间的碰撞检测!希望你能得到一个简单的解决方案.. !! – Gurjit
PLZ如果你不介意可以编辑我的checkCollision功能..! – Gurjit
@markE这个版本的情况下,更精简你考虑矩形“实”(圆被认为是在矩形内时发生碰撞)。我通过我的[测试小提琴](http://jsfiddle.net/CDLwP/4/)运行它,它像一个魅力。 –