首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pygame让一个圆圈围绕另一个圆圈旋转

Pygame让一个圆圈围绕另一个圆圈旋转
EN

Stack Overflow用户
提问于 2016-06-30 02:00:25
回答 2查看 1.2K关注 0票数 1

我想用pygame制作一些太阳系。我已经成功地做了一个修复的,但我认为做一个行星围绕太阳运行,卫星围绕行星运行等等会更有趣。有没有方法可以做到这一点(如果可能的话,使用pygame )?

我想要的是:

代码语言:javascript
复制
Sun = pygame.draw.circle(...)
planet1 = pygame.draw.circle(...)
etc.

a = [planet1, planet2, ...]

for p in a:
    move p[2] to pos(x, y)

这就是我认为可行的方法,但我不确定该怎么做。另外,我也想过删除这个古老的行星并在它旁边画一个新的,但问题是我使用了随机的特征(比如颜色,到太阳的距离,系统中的行星数量等等)。而且它必须保持这些相同的特征。有什么想法吗?

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2016-06-30 02:51:20

你可以用牛顿万有引力定律和牛顿第二定律来计算行星的加速度。给每颗行星一个初始位置,速度和质量。加速度是速度a = v * dt的变化,速度是位置v = r * dt的变化,所以我们可以积分来求速度和位置。

万有引力:F = G * m1 * m2 / r ** 2其中F是作用在物体上的力的大小,G是引力常数,m1m2是物体的质量,r是两个物体之间的距离。

牛顿第二定律,:F = m1 * a,这里a是加速度。

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2016-06-30 02:33:15

围绕太阳绕X轴旋转一定角度的行星的坐标是

,其中r是到太阳的距离,theta是角度,(a, b)是太阳的坐标。以(x, y)为中心绘制圆。

编辑:常规椭圆动态观察:

哪里

r0是具有相同角动量的圆形轨道的半径,e是椭圆的“偏心率”

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38106957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档