检测两个圆之间的碰撞角度
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
不动)。
我将不胜感激任何解释
你可以用一些简单的三角函数检测角度。
切线=Opposite/Adjecent
所以let angle = Math.atan(dy/dx)
解法:
我想我明白了:
arccos((ra^2+rb^2-c^2)/(2*ra*rb))
其中:
c
是两个圆心之间的距离(distance
在你的问题中)
ra
是第一个圆的半径
rb
是第二个圆的半径
代码:
在 JavaScript 中使用您的值,应该给出:
const angleInRadians = Math.acos((circle1.radius*circle1.radius + circle2.radius*circle2.radius - distance*distance)/(2*circle1.radius*circle2.radius))
注意结果以弧度为单位,见doc for acos
如果你想要度,只需使用转换:
const angleInDegrees = angleInRadians / Math.PI * 180
解释:
圆之间的角度定义为任何交点处的切线之间的角度(如果有两个点,则两个角度相同)。
切线之间的角度与相应半径之间的角度相同(因为半径与切线正交)。
获取半径之间的角度:
在两个中心和其中一个交点之间画一个三角形。根据交点处的角度使用law of cosines。
c^2 = ra^2 + rb^2 - 2*ra*rb*cos(alpha)
如果您需要更多解释,请随时在评论中提问。
我正在检测两个圆之间的碰撞,如下所示:
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
不动)。
我将不胜感激任何解释
你可以用一些简单的三角函数检测角度。
切线=Opposite/Adjecent
所以let angle = Math.atan(dy/dx)
解法:
我想我明白了:
arccos((ra^2+rb^2-c^2)/(2*ra*rb))
其中:
c
是两个圆心之间的距离(distance
在你的问题中)ra
是第一个圆的半径rb
是第二个圆的半径
代码: 在 JavaScript 中使用您的值,应该给出:
const angleInRadians = Math.acos((circle1.radius*circle1.radius + circle2.radius*circle2.radius - distance*distance)/(2*circle1.radius*circle2.radius))
注意结果以弧度为单位,见doc for acos
如果你想要度,只需使用转换:
const angleInDegrees = angleInRadians / Math.PI * 180
解释:
圆之间的角度定义为任何交点处的切线之间的角度(如果有两个点,则两个角度相同)。
切线之间的角度与相应半径之间的角度相同(因为半径与切线正交)。
获取半径之间的角度:
在两个中心和其中一个交点之间画一个三角形。根据交点处的角度使用law of cosines。
c^2 = ra^2 + rb^2 - 2*ra*rb*cos(alpha)
如果您需要更多解释,请随时在评论中提问。