用 Python 動態(tài)模擬太陽系運(yùn)轉(zhuǎn)

文 |?野客
來源:Python 技術(shù)「ID: pythonall」

提到太陽系,大家可能會想到哥白尼和他的日心說,或是捍衛(wèi)、發(fā)展日心說的斗士布魯諾,他們像一縷光一樣照亮了那個時代的夜空,對歷史感興趣的小伙伴可以深入了解一下,這里就不多說了。
太陽以巨大的引力使周邊行星、衛(wèi)星等繞其運(yùn)轉(zhuǎn),構(gòu)成了太陽系,它主要包括太陽、8 個行星、205 個衛(wèi)星以及幾十萬個小行星等,本文我們使用 Python 來簡單的動態(tài)模擬一下太陽系的運(yùn)轉(zhuǎn)。
實現(xiàn)
功能的實現(xiàn),主要要到的還是 Python 的 pygame 庫,我們先導(dǎo)入需要的所有 Python 庫,代碼如下所示:
import sysimport mathimport pygamefrom pygame.locals import *
接著定義一些常量(如:顏色、寬高等)及創(chuàng)建窗口,代碼如下所示:
WHITE =(255, 255, 255)SILVER = (192, 192, 192)BLACK = (0, 0, 0)GREEN = (0, 255, 0)RED = (255, 0, 0)BLUE = (0, 0, 255)YELLOW = (255, 255, 0)SandyBrown = (244, 164, 96)PaleGodenrod = (238, 232, 170)PaleVioletRed = (219, 112, 147)Thistle = (216, 191, 216)size = width, height = 800, 600screen = pygame.display.set_mode(size)pygame.display.set_caption("太陽系")# 創(chuàng)建時鐘(控制游戲循環(huán)頻率)clock = pygame.time.Clock()# 定義三個空列表pos_v = pos_e = pos_mm = []# 地球、月球等行星轉(zhuǎn)過的角度roll_v = roll_e = roll_m = 0roll_3 = roll_4 = roll_5 = roll_6 = roll_7 = roll_8 = 0# 太陽的位置(中心)position = size[0] // 2, size[1] // 2
我們先在窗口中畫一個太陽,代碼如下:
pygame.draw.circle(screen, YELLOW, position, 60, 0)看一下效果:

接著畫一個地球,讓其繞著太陽旋轉(zhuǎn),代碼如下:
roll_e += 0.01pos_e_x = int(size[0] // 2 + size[1] // 6 * math.sin(roll_e))pos_e_y = int(size[1] // 2 + size[1] // 6 * math.cos(roll_e))pygame.draw.circle(screen, BLUE, (pos_e_x, pos_e_y), 15, 0)pos_e.append((pos_e_x, pos_e_y))if len(pos_e) > 255:pos_e.pop(0)for i in range(len(pos_e)):pygame.draw.circle(screen, SILVER, pos_e[i], 1, 0)
看一下效果:

我們再接著畫月球,代碼如下:
# 畫月球roll_m += 0.1pos_m_x = int(pos_e_x + size[1] // 20 * math.sin(roll_m))pos_m_y = int(pos_e_y + size[1] // 20 * math.cos(roll_m))pygame.draw.circle(screen, SILVER, (pos_m_x, pos_m_y), 8, 0)# 月球的軌跡線pos_mm.append((pos_m_x, pos_m_y))if len(pos_mm) > 255:pos_mm.pop(0)for i in range(len(pos_mm)):pygame.draw.circle(screen, SILVER, pos_mm[i], 1, 0)
看一下效果:

其他幾個星球的實現(xiàn)也類似,代碼如下:
# 其他幾個行星roll_3 += 0.03pos_3_x = int(size[0] // 2 + size[1] // 3.5 * math.sin(roll_3))pos_3_y = int(size[1] // 2 + size[1] // 3.5 * math.cos(roll_3))pygame.draw.circle(screen, GREEN, (pos_3_x, pos_3_y), 20, 0)roll_4 += 0.04pos_4_x = int(size[0] // 2 + size[1] // 4 * math.sin(roll_4))pos_4_y = int(size[1] // 2 + size[1] // 4 * math.cos(roll_4))pygame.draw.circle(screen, SandyBrown, (pos_4_x, pos_4_y), 20, 0)roll_5 += 0.05pos_5_x = int(size[0] // 2 + size[1] // 5 * math.sin(roll_5))pos_5_y = int(size[1] // 2 + size[1] // 5 * math.cos(roll_5))pygame.draw.circle(screen, PaleGodenrod, (pos_5_x, pos_5_y), 20, 0)roll_6 += 0.06pos_6_x = int(size[0] // 2 + size[1] // 2.5 * math.sin(roll_6))pos_6_y = int(size[1] // 2 + size[1] // 2.5 * math.cos(roll_6))pygame.draw.circle(screen, PaleVioletRed, (pos_6_x, pos_6_y), 20, 0)roll_7 += 0.07pos_7_x = int(size[0] // 2 + size[1] // 4.5 * math.sin(roll_7))pos_7_y = int(size[1] // 2 + size[1] // 4.5 * math.cos(roll_7))pygame.draw.circle(screen, Thistle, (pos_7_x, pos_7_y), 20, 0)roll_8 += 0.08pos_8_x = int(size[0] // 2 + size[1] // 5.5 * math.sin(roll_8))pos_8_y = int(size[1] // 2 + size[1] // 5.5 * math.cos(roll_8))pygame.draw.circle(screen, WHITE, (pos_8_x, pos_8_y), 20, 0)
最后,我們來看一下整體實現(xiàn)的動態(tài)效果:

是不是有內(nèi)味了。
總結(jié)
本文我們使用 Python 簡單模擬了太陽系的運(yùn)轉(zhuǎn),有興趣的小伙伴可以自己運(yùn)行一下代碼或?qū)δ茏鲞M(jìn)一步擴(kuò)展。
源碼:https://github.com/JustDoPython/python-examples/tree/master/yeke/py-sun
評論
圖片
表情
