如何解决检测圆形和方形之间的碰撞
我知道这已经被问了很多,但就我个人而言,我找不到合适的答案。几乎无处不在,该函数看起来像:
function rccol(rect,circle){
var dx = Math.abs(circle.x - (rect.x + rect.width / 2));
var dy = Math.abs(circle.y - (rect.y + rect.height / 2));
if(dx > circle.radius + rect.width / 2) return false;
if(dy > circle.radius + rect.height / 2) return false;
if(dx <= rect.width) return true;
if(dy <= rect.height) return true;
var dx = dx - rect.width;
var dy = dy - rect.height
return((dx * dx + dy * dy) <= (circle.radius * circle.radius));
}
这很完美。问题是我在游戏中使用它进行碰撞检测,其中圆圈是玩家的碰撞盒,而正方形则是一堵墙。我需要能够确定接触发生的位置,以便我实际上可以防止“玩家”进入“墙”,因此返回的简单布尔值在我的用例中并没有真正起作用。
解决方法
有了圆心坐标 (cx,cy)
,您可以计算圆心到矩形的平方距离。
dx = Max(Abs(cx - rect.center.x) - rect.width / 2,0)
dy = Max(Abs(cy - rect.center.y) - rect.height / 2,0)
SquaredDistance = dx * dx + dy * dy
当圆最初在矩形之外时,可以删除 Max
调用。
dx = Abs(cx - rect.center.x) - rect.width / 2
dy = Abs(cy - rect.center.y) - rect.height / 2
我们也可以删除已知初始位置的 Abs
(注意 - 直到符号改变的时刻!)
if cx >= rect.center.x:
dx = cx - rect.center.x - rect.width / 2
else:
dx = - cx + rect.center.x - rect.width / 2
为了避免很多不同的情况,我们可以虚拟地将玩家放在相对于矩形中心的第一象限,并相应地改变坐标和速度分量
if cx0 < 0:
cx0 = - cx0
vx = -vx
if cy0 < 0:
cy0 = - cy0
vy = -vy
要记录碰撞力矩,您必须使用起点和速度矢量分量用参数方程代替坐标 (vx,vy)
cx = cx0 + vx * t
cy = cy0 + vy * t
并求解 t
SquaredDistance - Radius^2 = 0
(cx0 + vx * t - rect.center.x - rect.width/2)^2 +
(cy0 + vy * t - rect.center.y - rect.height/2)^2 -
Radius^2 = 0
在此之后,您可以获得零(无碰撞)、一个(触摸事件)或两个根(碰撞时刻和退出时刻)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。