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

Calculating the point where two circles touch based on circle1's velocity

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

圆 1 = C1,圆 2 = 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 '*余弦(dv)

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

你可以通过向量dv

的标量积求出Cos(dv)

Cos(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) 

检查简单情况:以(0,0)为中心的圆半径2,向右移动(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

对于 V 线上的每个 x,y 计算 C1 和 C2 中心之间的距离。 如果距离等于 r1+r2 那么圆圈永远接触。

P2(x2,y2) 是 C2 的中心 P1(x1,y1) 是 C1 在 V

上移动的计算中心

P1P2距离为:

SQuare Root of: (x2-x1)^2+(y2-y1)^2

一旦这等于 r1+r2 你应该停止

javascript 的距离函数是:

var d = Math.sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) );

或者如果您愿意:

var dist = Math.sqrt( Math.pow((x1-x2), 2) + Math.pow((y1-y2), 2) );

你需要解决几个步骤

  1. 设置equation of motion并施加圆圈接触的标准

    | P1 + v * t - P2 | = R1 + R1

    其中 P1P 2分别为圆1和2的初始位置,t是时间。

  2. 对方程求平方并使用 quadratic equation

  3. 求解相交时间
  4. 利用交点时间求解圆1的交点位置

  5. 一旦知道圆 1 在相交时刻的位置,并且由于圆 2 是静态的,解决 circle-circle intersection 问题