我想用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)这就是我认为可行的方法,但我不确定该怎么做。另外,我也想过删除这个古老的行星并在它旁边画一个新的,但问题是我使用了随机的特征(比如颜色,到太阳的距离,系统中的行星数量等等)。而且它必须保持这些相同的特征。有什么想法吗?
提前感谢!
发布于 2016-06-30 02:51:20
你可以用牛顿万有引力定律和牛顿第二定律来计算行星的加速度。给每颗行星一个初始位置,速度和质量。加速度是速度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
发布于 2016-06-30 02:33:15
围绕太阳绕X轴旋转一定角度的行星的坐标是

,其中r是到太阳的距离,theta是角度,(a, b)是太阳的坐标。以(x, y)为中心绘制圆。
编辑:常规椭圆动态观察:

哪里

r0是具有相同角动量的圆形轨道的半径,e是椭圆的“偏心率”
https://stackoverflow.com/questions/38106957
复制相似问题