Javascript 检测两个圆之间的碰撞角

Javascript 检测两个圆之间的碰撞角,javascript,math,collision-detection,Javascript,Math,Collision Detection,我检测到两个圆之间的碰撞,如下所示: var circle1 = {radius: 20, x: 5, y: 5}; //moving var circle2 = {radius: 12, x: 10, y: 5}; //not moving var dx = circle1.x - circle2.x; var dy = circle1.y - circle2.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <

我检测到两个圆之间的碰撞,如下所示:

var circle1 = {radius: 20, x: 5, y: 5}; //moving
var circle2 = {radius: 12, x: 10, y: 5}; //not moving

var dx = circle1.x - circle2.x;
var dy = circle1.y - circle2.y;
var distance = Math.sqrt(dx * dx + dy * dy);


if (distance < circle1.radius + circle2.radius) {
    // collision detected
}
我的问题是如何检测圆环2的碰撞角?圆圈2没有移动。
如果您能用简单的三角学来检测角度,我将不胜感激

切线=相反/相邻


因此,让angle=Math.atandy/dx

你可以用一些简单的三角法来检测角度

切线=相反/相邻

因此,让angle=Math.atandy/dx

解:

我想我明白了:

弧段^2+rb^2-c^2/2*ra*rb

其中:

c是你问题中两个圆中心之间的距离 ra是第一个圆的半径 rb是第二个圆的半径 代码: 在带有值的JavaScript中,应该给出:

const angleInRadians = Math.acos((circle1.radius*circle1.radius + circle2.radius*circle2.radius - distance*distance)/(2*circle1.radius*circle2.radius))
请注意,结果以弧度为单位,请参见

如果希望以度为单位,只需使用转换:

const angleInDegrees = angleInRadians / Math.PI * 180
说明:

圆之间的角度定义为任意交点处切线之间的角度。如果有两点,则两个角度相同

切线之间的角度与相应半径之间的角度相同,因为半径与切线正交

要获取半径之间的角度,请执行以下操作:

在两个中心和一个交点之间画一个三角形。基于交点处的角度使用

c^2=ra^2+rb^2-2*ra*rb*cosapha

如果您需要更多解释,请随时发表评论。

解决方案:

我想我明白了:

弧段^2+rb^2-c^2/2*ra*rb

其中:

c是你问题中两个圆中心之间的距离 ra是第一个圆的半径 rb是第二个圆的半径 代码: 在带有值的JavaScript中,应该给出:

const angleInRadians = Math.acos((circle1.radius*circle1.radius + circle2.radius*circle2.radius - distance*distance)/(2*circle1.radius*circle2.radius))
请注意,结果以弧度为单位,请参见

如果希望以度为单位,只需使用转换:

const angleInDegrees = angleInRadians / Math.PI * 180
说明:

圆之间的角度定义为任意交点处切线之间的角度。如果有两点,则两个角度相同

切线之间的角度与相应半径之间的角度相同,因为半径与切线正交

要获取半径之间的角度,请执行以下操作:

在两个中心和一个交点之间画一个三角形。基于交点处的角度使用

c^2=ra^2+rb^2-2*ra*rb*cosapha


如果您需要更多的解释,请随时发表评论。

使用两个圆的中心点,您应该能够计算角度:使用两个圆的中心点,您应该能够计算角度:顺便说一句,有人知道我们是否可以使用乳胶,例如?@adam west:这花了我一点时间,但我想我现在有了正确的解决办法。请参阅我最后一个版本的答案。谢谢您的支持explanation@adamwest:还请注意,这可能会给您一个钝角,而不是像我的图片中那样的锐角。要解决这个问题,就拿数学来说吧。minangleInDegrees,180-angleInDegrees。顺便说一句,有人知道我们是否可以在上面使用乳胶吗?亚当·韦斯特:这花了我一点时间,但我想我现在有了正确的解。请参阅我最后一个版本的答案。谢谢您的支持explanation@adamwest:还请注意,这可能会给您一个钝角,而不是像我的图片中那样的锐角。要解决这个问题,只需使用Math.minangleInDegrees,180 angleInDegrees。