Abstract
- 本篇将探讨在一个出现了一点偏差的圆形台球桌内台球的运动轨迹。(圆形的台球桌什么的本来就很诡异了吧)
I have a ball.
~~I have a table. ~~
Ahhh...
Billi-ard!
- ~~I have a
Python
. ~~
~~I have a H.Cai. ~~
Ahhhhhhh...
Chaoooooooos!
- ~Billi-ard~~
Chaoooooooos
Ahhhhhhh.........
Ahhhhhhhhhh.........
Ahhhhhhhhhhhhhhhh.........
Background
-
台球本身是件很有意思的事,球在有限的区域内被桌沿或其他的球反弹,逐渐按照既定的速滚走向既定的方向,将目标球击落袋。
- 假如你把它放进物理里,就会显得更(
丧)加(心)有(病)趣(狂)。 - 我们将探讨一个球在圆形桌内的运动,以及当那个圆并不那么圆时,球在那个不那么圆的圆桌内的运动。
What a Weird Shape!
- 这个问题我们也将其简化,我们认为球在桌上的运动是无耗散的,可以永远地滚下去。
- 同时我们也认为,球在边缘上的反弹是完美的:
入射与反射角相等
- 当球碰到边缘时,我们将这样处理他的碰壁和反弹:
...
x_next = self.x[-1] + self.vx * self.dt
y_next = self.y[-1] + self.vy * self.dt
# 下一个点没有越界
if x_next ** 2 + (abs(y_next) - self.alpha) ** 2 < 1:
self.x.append(x_next)
self.y.append(y_next)
if abs(self.y[-1]) < 0.001:
self.ps_vx.append(self.vx)
self.ps_x.append(self.x[-1])
# 下个点成功越界,计算碰撞点并计算碰撞后速度
else:
divisor = 2
# 往回走一点点
while divisor <= 2048:
x_next -= (self.vx * self.dt / divisor)
y_next -= (self.vy * self.dt / divisor)
# 当下个点与边界距离在误差允许范围内时,跳出 loop
if abs(x_next ** 2 + (abs(y_next) - self.alpha) ** 2 - 1) < 0.00001:
divisor = 10000
# 如果刚刚往回走过了,撤销那一步,下一次走得再小一点
...
- 碰撞后,我们采用(level.6)矢量操作的方式计算碰撞后的速度。
- 可以得到轨迹图:
- 考虑当alpha = 0.1时,两个仅有微小初始值差异的台球的运动轨迹区别,弄了张动图,
matplotlib
库做了一点微小的贡献
-
上图,可以预见二者分离度将在600以后达到1上下,也就是说两个系统将完全分离,
-
上图,台球十分争气地滚得乱七八糟
(逃)
-
alpha = 0.1,可以看到在500s内他的偏差都是很小的,只有-6的指数级别,但是当我们把时间增加一倍,从500s增加到1000s的时候:
两个小球也几乎没有产生大的偏差,那么当球桌是个正圆的时候呢?
-
两个球的分离度几乎肉眼不可见(废话!)
Acknowledgements!
-
磊锅锅张磊 (就冲着这名字我也得把你从致谢里删了_(:D」∠)_)