python - 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)

我认为这可行,但我不知道该怎么做。另外,我考虑过删除古老的行星并在它旁边绘制一个新的行星,但问题是我使用随机特征(如颜色、到太阳的距离、系统中行星的数量等)并且它必须保留这些相同的功能。有任何想法吗?

提前致谢!

最佳答案

您可以利用牛顿万有引力定律和牛顿第二定律来实现引力,以获得行星的加速度。给每个行星一个初始位置、速度和质量。加速度是速度的变化a = v * dt,速度是位置的变化v = r * dt,因此我们可以积分来找到速度和位置。

万有引力:F = G * m1 * m2/r ** 2 其中F是物体上的力的大小,G 是万有引力常数,m1m2 是物体的质量,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/

相关文章:

objective-c - 动态移动 UIButton

python - Python 的 time.time() 是否返回 UTC 时间戳?

python - 一次导入 CSV 文件目录,每个文件只保留最旧的记录

ios - 方向更改后如何避免调整 UITableView(旋转)单元格的大小?

iphone - iPad 上的 UIWebView 旋转

javascript奇怪的行为

c# - 如何获得窗口的位置?

python - 如何使用 pdfpages 将数据框添加到 pdf 文件

python - python中的方法链接

Android 添加平滑的屏幕旋转效果