这可能是数学问题,而不是编程问题,但这是可行的。
我正在尝试给出一个公式,该公式给出了两个圆在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)。我无法弄清楚该如何做,所以我一直在使用蛮力方法来做到这一点。可以解决这个问题,还是有更好的方法呢?
答案 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
正值(如果最初的圆圈分开了!)的根是