如何利用Python動態(tài)模擬太陽系運(yùn)轉(zhuǎn)
前言
提到太陽系,大家可能會想到哥白尼和他的日心說,或是捍衛(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 sys import math import pygame from 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, 600 screen = 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 = 0 roll_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.01 # 假設(shè)地球每幀公轉(zhuǎn) 0.01 pi pos_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.1 pos_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.03 pos_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.04 pos_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.05 pos_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.06 pos_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.07 pos_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.08 pos_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ò)展。
到此這篇關(guān)于如何利用Python動態(tài)模擬太陽系運(yùn)轉(zhuǎn)的文章就介紹到這了,更多相關(guān)Python動態(tài)模擬太陽系運(yùn)轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決python3 Pycharm上連接數(shù)據(jù)庫時報錯的問題
今天小編就為大家分享一篇解決python3 Pycharm上連接數(shù)據(jù)庫時報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python+OpenCV圖片局部區(qū)域像素值處理詳解
這篇文章主要為大家詳細(xì)介紹了Python+OpenCV圖片局部區(qū)域像素值處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01將TensorFlow的模型網(wǎng)絡(luò)導(dǎo)出為單個文件的方法
本篇文章主要介紹了將TensorFlow的網(wǎng)絡(luò)導(dǎo)出為單個文件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04python實現(xiàn)視頻抽幀與添加背景音頻和字幕朗讀的腳本分享
這篇文章主要為大家詳細(xì)介紹了如何使用python實現(xiàn)視頻抽幀、添加srt字幕朗讀、添加背景音頻等功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11Pandas之Dropna濾除缺失數(shù)據(jù)的實現(xiàn)方法
這篇文章主要介紹了Pandas之Dropna濾除缺失數(shù)據(jù)的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06