【问题标题】:Calculating the point where two circles touch based on circle1's velocity根据 circle1 的速度计算两个圆接触的点
【发布时间】:2015-07-05 15:32:10
【问题描述】:

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

圆 1 = C1,圆 2 = C2。

C1 有一个速度和方向,会导致它在某个点接触 C2。

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

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

第一帧:

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.

【问题讨论】:

标签: javascript math vector simulation physics


【解决方案1】:

触摸瞬间的中心距为

R12 = R1 + R2

所以使用余弦定理:

R122 = v'2 + d2 - 2*d*v'*Cos(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) 

检查简单情况:圆半径 2 以 (0,0) 为中心,向右移动 (v = (10,0));静态圆半径 3 居中 (6,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' 和二次方程求解。至于使用内置 Math.cos(dv) 的标量积;在js中应该足够了。
  • 二次方程的通常形式是x^2 + B * x + C = 0,这里未知x =v',B = 2 * (d * v) / |v|和 C = (d^2 - R12^2)
  • 好的。只是为了澄清 v' 到底是什么意思?
【解决方案2】:

你需要解决几个步骤

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

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

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

  2. 使用quadratic equation对方程求平方并求解相交时间

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

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

【讨论】:

    【解决方案3】:

    对于 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 的 Distnace 函数是:

    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) );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多