javascript - 根据circle1的速度计算两个圆接触的点

标签 javascript math vector simulation physics

我们有两个圆圈,Circle1 和 Circle2,Circle2 是静止的,Circle1 是运动的。

Circle1 = C1,Circle2 = C2。

C1 的速度和方向会使其在某一点接触 C2。

v 是描述 C1 速度的向量。 d为C1中心点到C2中心点的距离。

我们也知道两个圆的半径。

第 1 帧:

C1 尚未与 C2 发生碰撞,但我们可以看到它会在下一帧发生碰撞。

第 2 帧:

C1 现在与 C2 相交。

第2帧(计算后):

C1 现在已经定位在它第一次接触 C2 的位置。

所以问题是,我们如何计算(最好是在 js 中)沿 v 的点 C1 应该停止?

当前代码:

//    x^2 + B * x + C = 0
//    x= v'
//    B = 2 * (d.x * v.x + d.y*v.y)/Math.sqrt(v.x*v.x + v.y*v.y)
//    C = (d.length()^2 - rs^2)

// get distance from ri to ri2 as a vector.
var d = new Vector(ri2.x - ri.x, ri2.y - ri.y);
// get sum of radiuses.
var rs = ri.r + ri2.r;

var A = 1;
var B = 2 * (d.x * v.x + d.y*v.y)/Math.sqrt(v.x*v.x + v.y*v.y);
var C = (d.length()^2 - rs^2);

var x1 = (-B + Math.sqrt(Math.pow(B, 2) - 4 * A * C)) / 2 * A;
var x1 = (-B - Math.sqrt(Math.pow(B, 2) - 4 * A * C)) / 2 * A;

// and then we get the lowest positive of x1 & x2.

最佳答案

触摸瞬间的中心距为

R12 = R1 + R2

所以使用余弦定理:

R122 = v'2 + d2 - 2*d*v'*Cos(dv)

对 v' 求解此二次方程并得到更小的正解值(如果存在 2 种情况)。

您可以通过向量 dv 的标量积求 Cos(dv)

余弦(dv) = d * v/(|d||v|)

所以最终的二次方程是

v'2 - v' * 2 * (d * v)/|v| + (d2 - R122) = 0

对于标准形式

x^2 + B * x + C = 0    
x= v'
B =  -2 * (d.x * v.x + d.y*v.y)/Sqrt(v.x*v.x + v.y*v.y)
C = (d^2 - R12^2) 

检查简单情况:圆半径 2 以 (0,0) 为中心,向右移动 (v = (10,0));以 (6,3) 为中心的静态圆半径 3。结果应该是 v'=2

B = -2*(6*10+3*0)/10= -12
C=45-(2+3)^2=20
Determinant = B*B - 4*C = 144-80 = 64
v'= (12 +- 8)/2
smaller value v'=2

enter image description here

关于javascript - 根据circle1的速度计算两个圆接触的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31231971/

相关文章:

C++、Python、不兼容的数字类型

javascript - 预输入未显示建议​​列表

javascript - 预绘制 Raphael 屏幕,将其保存到文件并在运行时加载

math - 如何从等式中得到 Radon 变换伪代码

python - 通过查找模式从序列中生成下一个元素的算法

c++ - 通过在每个元素上调用 name() 将 Class 的 vector 转换为 decltype(Class::name()) 的 vector

c++ - 组合字符串 vector

javascript - 是否可以在 Kue Node.js 中更新已创建的作业?

javascript - 如何添加一个js条件

python - 以相同的方式、算法或数学方程从列表中获取元素