如何计算两个圆圈向外接触的时间?

时间:2018-11-29 04:13:12

标签: math 2d physics

这可能是数学问题,而不是编程问题,但这是可行的。

我正在尝试给出一个公式,该公式给出了两个圆在2D空间中何时相互接触,并给出了圆上的起始位置,半径和作用力(例如重力)。我已经能够提出一个公式,但是我试图找出它是否可以解决“ t”(时间)问题。

var c1r, // radius of circle #1
    c1x, // x position of circle #1 at time 0
    c1y, // y position of circle #1 at time 0
    c1vx, // x velocity of circle #1 at time 0
    c1vy, // y velocity of circle #1 at time 0
    c1fx, // x force (such as gravity) on circle #1 at time 0
    c1fy; // y force (such as gravity) on circle #1 at time 0

var c2r, // radius of circle #2
    c2x, // x position of circle #2 at time 0
    c2y, // y position of circle #2 at time 0
    c2vx, // x velocity of circle #2 at time 0
    c2vy, // y velocity of circle #2 at time 0
    c2fx, // x force (such as gravity) on circle #2
    c2fy; // y force (such as gravity) on circle #2

鉴于这些,我知道我需要弄清楚何时圆心是半径分开的总和。

var targetDist = c1r + c2r;

我知道单个圆的轨迹公式:

function c1_position(t) (
    return {
        x: c1x + (c1vx * t) + (.5 * c1fx * Math.pow(t, 2)),
        y: c1y + (c1vy * t) + (.5 * c1fy * Math.pow(t, 2))
    }
 }

当然还有距离公式:

function distance(c1x, c1y, c2x, c2y) {
    return Math.sqrt(Math.pow(c2x - c1x, 2) + Math.pow(c2y - c1y, 2));
}

结合这两个公式,并以时间(t)作为未知数:

var t;

Math.pow(targetDist, 2) = Math.pow((c2x + (c2vx * t) + (.5 * c2fx * Math.pow(t, 2))) - (c1x + (c1vx * t) + (.5 * c1fx * Math.pow(t, 2))), 2) + Math.pow((c2y + (c2vy * t) + (.5 * c2fy * Math.pow(t, 2))) - (c1y + (c1vy * t) + (.5 * c1fy * Math.pow(t, 2))), 2);

我需要做的是解决时间(t)。我无法弄清楚该如何做,所以我一直在使用蛮力方法来做到这一点。可以解决这个问题,还是有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

首先:我们可以将圆碰的问题转化为碰大圆(r=r1+r2)并指向的问题

第二:为了稍微简化方程式,我们可以应用伽利略原理:在与一个中心相连的移动系统中工作。该系统不是惯性系统,但对于碰撞计算而言并不重要。

因此,将第二个圆心固定为固定点(0,0),并寻找一个矩,当第二个圆心的距离为r=r1+r2时。在该坐标系的起始位置,相对速度,相对加速度为

 x0 = c2x - c1x
 y0 = c2y - c1y
 vx = c2vx - c1vx
 vy = c2vy - c1vy
 ax = c2fx - c1fx   //I assume that force is really acceleration (force/mass)
 ay = c2fy - c1fy

现在使用点的移动方程式,我们可以像您一样获得碰撞时刻的公式:

r^2 = (x0 + vx*t+ ax*t^2/2)^2 + (y0 + vy*t+ ay*t^2/2)^2

开括号:

r^2 = x0^2 + vx^2*t^2 + ax^2*t^4/4 + 2*x0*vx*t + 2*vx*ax*t^2/2 + 2*vx*ax*t^3/2 + 
      y0^2 + vy^2*t^2 + ay^2*t^4/4 + 2*y0*vy*t + 2*vy*ay*t^2/2 + 2*vy*ay*t^3/2
or
      t^4 * 1/4*(ax^2 + ay^2) + 
      t^3 * (vx*ax + vy*ay) +
      t^2 * (vx^2 + vy^2 + vx*ax + vy*ay) + 
      t *   (vx^2 + vy^2 + 2*x0*vx + 2*y0*vy) +
            (x0^2 + y0^2 - r^2) = 0 

这是未知t的四次方程。它可以解析地求解,并给出0到4个实际解。 Wiki page。毫无疑问,您可以轻松找到用于此目的的现成JS代码/库。

具有最低t正值(如果最初的圆圈分开了!)的根是