繁体   English   中英

检测两个圆之间的碰撞角

[英]detecting collision angle between two circle

我正在这样检测两个圆之间的碰撞:

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
}

我的问题是如何检测circle2的碰撞角度? circle2没有移动)。 我将不胜感激任何解释

您可以使用一些简单的三角函数来检测角度。

切线=对面/相邻

所以let angle = Math.atan(dy/dx)

解决方案:

我想我明白了:

arccos((ra^2+rb^2-c^2)/(2*ra*rb))

在哪里:

  • c是两个圆心之间的distance (您的问题中的distance
  • ra是第一个圆的半径
  • rb是第二个圆的半径

代码:在具有您的值的JavaScript中,应该给出:

const angleInRadians = Math.acos((circle1.radius*circle1.radius + circle2.radius*circle2.radius - distance*distance)/(2*circle1.radius*circle2.radius))

请注意,结果以弧度为单位 ,请参阅doc中的acos

如果要以度为单位 ,则使用转换:

const angleInDegrees = angleInRadians / Math.PI * 180

说明:

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

切线之间的角度与相应半径之间的角度相同(因为半径垂直于切线)。

获取半径之间的角度:

在两个中心和一个交点之间绘制一个三角形。 根据交点处的角度使用余弦定律

c^2 = ra^2 + rb^2 - 2*ra*rb*cos(alpha)

2个圆圈相交的草图

如果您需要更多说明,请随时在评论中提问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM