math - 如何计算两个圆圈外部接触的时间?
问题描述
这可能更像是一个数学问题,而不是一个编程问题,但在这里。
考虑到起始位置、半径和作用在圆上的力(如重力),我正在尝试提出一个公式,用于计算两个圆何时在 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,还是有更好的方法?
解决方案
首先:我们可以将圆接触问题转化为大圆(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
(如果最初的圆圈是分开的!)是接触的时刻
推荐阅读
- wordpress - 如何阻止循环影响主菜单?
- python-3.x - %%timeit 或 %timeit 给出 UnboundLocalError
- nginx - 让 Google Cloud CDN 在 404 上提供陈旧文件
- sql-server - 在 SQL 选择子句中使用子查询返回多行
- php - php代码更新拆分和计数不起作用
- wordpress - 谷歌日历链接和错误的开始/结束时间
- static -
在 Nuxt 中使内容在运行生成时消失 - python - 每次刷新页面时,Python Selenium ID 标签都会更改
- csv - 如何识别 csv 文件中的最大值?
- tensorflow2.0 - 带有 Fine-tune 的模型多次检测同一对象