首页 > 解决方案 > 如何计算两个圆圈外部接触的时间?

问题描述

这可能更像是一个数学问题,而不是一个编程问题,但在这里。

考虑到起始位置、半径和作用在圆上的力(如重力),我正在尝试提出一个公式,用于计算两个圆何时在 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)内解决这个问题。我无法弄清楚如何做到这一点,所以我一直在使用蛮力方法来做到这一点。这可以解决t,还是有更好的方法?

标签: math2dphysics

解决方案


首先:我们可以将圆接触问题转化为大圆(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 

这是 unknown 的四次方程t。它可以通过解析求解并给出 0 到 4 个真实解。维基页面。毫无疑问,您可以轻松找到用于此目的的现成 JS 代码/库。

具有最低正值的根t如果最初的圆圈是分开的!)是接触的时刻


推荐阅读