我想在 pygame 中制作某种太阳系。我已经成功地做了一个固定的,但我认为做一个行星围绕太阳移动和月亮围绕行星等移动的行星会更有趣。有没有一种方法可以做到这一点(如果可能的话使用 pygame)?
我想要的是:
Sun = pygame.draw.circle(...)
planet1 = pygame.draw.circle(...)
etc.
a = [planet1, planet2, ...]
for p in a:
move p[2] to pos(x, y)
我认为这可行,但我不知道该怎么做。另外,我考虑过删除古老的行星并在它旁边绘制一个新的行星,但问题是我使用随机特征(如颜色、到太阳的距离、系统中行星的数量等)并且它必须保留这些相同的功能。有任何想法吗?
提前致谢!
最佳答案
您可以利用牛顿万有引力定律和牛顿第二定律来实现引力,以获得行星的加速度。给每个行星一个初始位置、速度和质量。加速度是速度的变化a = v * dt
,速度是位置的变化v = r * dt
,因此我们可以积分来找到速度和位置。
万有引力:F = G * m1 * m2/r ** 2
其中F
是物体上的力的大小,G
是万有引力常数,m1
和 m2
是物体的质量,r
是物体之间的距离两个物体。
牛顿第二定律:F = m1 * a
其中 a 是加速度。
dt = 0.01 # size of time step
G = 100 # gravitational constant
def calcGravity(sun, planet):
'Returns acceleration of planet with respect to the sun'
diff_x = sun.x - planet.x
diff_y = sun.y - planet.y
acceleration = G * sun.mass / (diff_x ** 2 + diff_y ** 2)
accel_x = acceleration * diff_x / (diff_x ** 2 + diff_y ** 2)
accel_y = acceleration * diff_y / (diff_x ** 2 + diff_y ** 2)
return accel_x, accel_y
while True:
# update position based on velocity
planet.x += planet.vel_x * dt
planet.y += planet.vel_y * dt
# update velocity based on acceleration
accel_x, accel_y = calcGravity(sun, planet)
planet.vel_x += accel_x * dt
planet.vel_y += accel_y * dt
这可以产生圆形和椭圆形轨道。创建绕轨道运行的卫星需要非常小的时间步长 (dt) 进行数值积分。
注意:由于数值积分的限制,这种方法有点不准确。
这里是 pygame 的示例实现,包括三个围绕太阳、月亮旋转的行星和基本的轨道转移。 https://github.com/c2huc2hu/orbital_mechanics
关于python - Pygame 让一个圆围绕另一个圆旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38106957/