【发布时间】:2021-05-01 04:56:07
【问题描述】:
我被一个特定的项目困住了——Lee Vaughan 的《不切实际的 Python 项目》一书的第 13 章(模拟外星火山)。
在其中,我们应该模拟木星卫星 Io 上的火山。代码可以找到here:
我的具体查询:
我了解粒子的位移首先通过以下方式计算:
radians = math.radians(orient)
self.dx = self.vel * math.cos(radians)
self.dy = -self.vel * math.sin(radians) # negative as y increases down
然后重力被添加到Y轴:
self.dy += Particle.GRAVITY
pg.draw.line(self.background, self.color, (self.x, self.y), (self.x + self.dx, self.y + self.dy))
self.x += self.dx
self.y += self.dy
我的问题是:在上述所有情况下,在某一时刻,重力必须足够大,以至于粒子开始下降而不是上升;然而,self.dy 只是两个常数(初始速度、重力)的函数。所以它应该继续走直线。例如,对于以某个角度(例如,z)喷射的粒子:
self.dy = self.vel*math.sin(z) + particle.GRAVITY
这里,
- self.vel 已修复
- z 对于每种粒子类型都是固定的
- 每种粒子类型的重力都是固定的
因此,“dy”在任何给定时间段内都将保持不变。然而,模拟显示了弹丸运动......如何?
【问题讨论】:
-
重力在每个时间步被添加到
dy。所以,引力越来越大。加速度是二阶导数,因此会修改每一步的速度,然后修改位置。 -
谢谢,知道了。我被第 50 行弄糊涂了。我原以为更新函数在后续更新中是 dy + Gravity,但我现在看到它只是 dy += Gravity(在第一个周期后基本上覆盖了第 50 行。非常感谢。跨度>