计算2个移动球将碰撞的x/y点

use*_*151 9 language-agnostic math physics collision-detection

我试图制作(基本上)一个简单的游泳池游戏,并希望能够预测一旦它击中另一个球后射击的位置.

我相信,第一部分是计算cueball是否会击中任何东西,如果是,它会碰撞到哪里.我可以计算出一条线和一个球的碰撞点,但不是2个球.

因此,考虑到2个球的x/y位置和速度,我如何计算它们碰撞的点?

(PS:我知道我可以通过计算沿途每一步的两个球之间的距离来做到这一点,但我希望有一些更优雅和最优的东西.)

设置示例:尝试计算红点

http://dl.dropbox.com/u/6202117/circle.PNG

dmc*_*kee 14

有些事情需要注意:

  • 当两个球,每个半径r相撞时,它们的中心是2r分开的.
  • 你可以假设你的第一个球是直线行进的(好的,先是近似,但从这开始),你可以找到alpha这个路径与从第一个球到第二个球的方向之间的角度.
  • 你知道固定球的中心,不是吗?

现在你有一些几何要做.

做这个结构:

  1. 将第一个(移动)球的当前中心标记为点A.
  2. 将静止球的中心标记为点B.
  3. 构建线段AB.
  4. RA运动方向构造射线.
  5. 构建半径的圆2r左右B.
  6. B垂直方向放下一段以R调用交叉点C.
  7. 你知道的距离AB,你可以找到的角度alpha之间ABR,用正弦定理发现的长度BC.
  8. 从该长度确定是否存在0,1或2个解决方案.如果有0或1你就完成了.
  9. 构造D圆与RA更接近的点,并再次使用正弦定律来找到距离AD.
  10. 碰撞点是中点 BD

现在你知道一切.

从中构建有效的代码留作练习.


BTW--如果两个球都在移动,这种结构将不起作用,但你可以变换成一个静止的框架,以那种方式解决,然后转换回来.请务必在反向转换检查解决方案是否在允许的区域 ...

/物理学家不能不这样做评论.我试图抵制.我真的做到了.


Dr.*_*ius 12

绘制@dmckee的答案

替代文字

编辑

只是为了回应@ArtB死灵法师的回答,可以写出上图中D点的解决方案:

1/2 {(Ax+Bx+2 d Dx Cos[alpha]- Dx Cos[2 alpha]+ 2 Dy (Cos[alpha]-d) Sin[alpha]), 
     (Ay+By+2 d Dy Cos[alpha]- Dy Cos[2 alpha]- 2 Dx (Cos[alpha]-d) Sin[alpha])
     }  
Run Code Online (Sandbox Code Playgroud)

哪里

Dx = Ax - Bx 
Dy = Ay - By   
Run Code Online (Sandbox Code Playgroud)

d = Sqrt[4 r^2 - (Dx^2 + Dy^2) Sin[alpha]^2]/Sqrt[Dx^2 + Dy^2]  
Run Code Online (Sandbox Code Playgroud)

HTH!