Python 使一个圆围绕另一个圆旋转
我想在pygame中制作一些太阳系。我已经设法做了一个固定的,但我认为这将是更有趣的做一个行星围绕太阳和卫星围绕行星等有一种方法,我可以做到这一点(使用pygame,如果可能的话) 我想要的是:Python 使一个圆围绕另一个圆旋转,python,rotation,position,geometry,pygame,Python,Rotation,Position,Geometry,Pygame,我想在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) 这是我认为会起作用的,但我
Sun = pygame.draw.circle(...)
planet1 = pygame.draw.circle(...)
etc.
a = [planet1, planet2, ...]
for p in a:
move p[2] to pos(x, y)
这是我认为会起作用的,但我不知道怎么做。此外,我曾考虑删除这颗古老的行星,并在它旁边画一颗新的,但问题是我使用了随机特征(如颜色、到太阳的距离、系统中行星的数量等),它必须保留这些相同的特征。有什么想法吗
提前谢谢 一颗行星绕太阳旋转,相对于X轴有一定角度的坐标是,其中
r
是到太阳的距离,theta
是该角度,(a,b)
是太阳的坐标。以(x,y)
为中心绘制圆
编辑:
一般椭圆轨道:
在哪里
r0
是具有相同角动量的圆形轨道的半径,e
是椭圆的“偏心率”你可以用牛顿万有引力定律和牛顿第二定律来实现重力,从而得到行星的加速度。给每个行星一个初始位置、速度和质量。加速度是速度的变化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中的示例实现,包括围绕太阳、月亮旋转的三颗行星和基本的轨道转移。
非常感谢!事实上,最好是有一个椭圆轨道,但如果太乱了,不要担心。这个公式会使行星移动吗?非常感谢你的回答!行星的速度是否取决于它与太阳的距离,取决于它的质量。。。?此外,我如何在pygame中实现朝某个方向的移动(我是初学者,请不要喊^^)。非常感谢,虽然非常有用。是的,一颗行星离太阳越近,其轨道越快(见开普勒第二定律)。行星的质量并不影响它的速度(因为质量会被牛顿第二定律抵消)。太阳的质量将影响维持相同轨道所需的速度:更重意味着你需要走得更快。这两者都是万有引力的结果。我将编辑我的回复,以更详细地了解velocity的实现。