你們要的Python繪畫3D太陽系詳細(xì)代碼
用Python畫一個平面的太陽系得到一些朋友的欣賞,然后有同學(xué)提出了繪制三維太陽系的要求。
從Python畫圖的角度來說,三維太陽系其實(shí)并不難,問題在于八大行星對黃道面的傾斜太小,所以盡管畫個三維的圖,但就觀感而言,無非是把二維的嵌入到三維空間罷了。
來點(diǎn)小行星
代碼如下
from os import cpu_count import numpy as np from numpy.random import rand import matplotlib.pyplot as plt from matplotlib import animation au,G,RE,ME = 1.48e11,6.67e-11,1.48e11,5.965e24 m = np.array([3.32e5,0.055,0.815,1,0.107,317.8])*ME*G r = np.array([0,0.387,0.723,1,1.524,5.203])*RE v = np.array([0,47.89,35.03,29.79,24.13,13.06])*1000 theta = rand(len(m))*np.pi*2 cTheta,sTheta = np.cos(theta), np.sin(theta) xyz = r*np.array([cTheta, sTheta, 0*r]) #位置三分量,因?yàn)閰?shù)太多,所以把這三個分量寫在了一起 uvw = v*np.array([-sTheta, cTheta, 0*v]) #速度三分量 N_ast = 100 m_ast = rand(N_ast)*1e20 r_ast = (rand(N_ast)*3.5+1.6)*RE v_ast = np.sqrt(G*3.32e5*ME/r_ast) #小行星速度sqrt(GM/R) theta = rand(N_ast)*np.pi*2 phi = (rand(N_ast)-0.5)*0.3 #給一個隨機(jī)的小傾角 cTheta,sTheta = np.cos(theta), np.sin(theta) cPhi,sPhi = np.cos(phi),np.sin(phi) xyza = r_ast*np.array([cTheta*cPhi, sTheta*cPhi, sPhi]) uvwa = v_ast*np.array([-sTheta*cPhi, cTheta*cPhi, sPhi]) name = "solar.gif" fig = plt.figure(figsize=(10,10)) ax = fig.add_subplot(projection='3d') ax.grid() ax.set_xlim3d([-5.5*RE,5.5*RE]) ax.set_ylim3d([-5.5*RE,5.5*RE]) ax.set_zlim3d([-5.5*RE,5.5*RE]) traces = [ax.plot([],[],[],'-', lw=0.5)[0] for _ in range(len(m))] pts = [ax.plot([],[],[],marker='o')[0] for _ in range(len(m))] pt_asts = [ax.plot([],[],[],marker='.')[0] for _ in range(N_ast)] N = 500 dt = 3600*50 ts = np.arange(0,N*dt,dt) xyzs,xyzas = [],[] for _ in ts: xyz_ij = (xyz.reshape(3,1,len(m))-xyz.reshape(3,len(m),1)) r_ij = np.sqrt(np.sum(xyz_ij**2,0)) xyza_ij = (xyz.reshape(3,1,len(m))-xyza.reshape(3,N_ast,1)) ra_ij = np.sqrt(np.sum(xyza_ij**2,0)) for j in range(len(m)): for i in range(len(m)): if i!=j : uvw[:,i] += m[j]*xyz_ij[:,i,j]*dt/r_ij[i,j]**3 for i in range(N_ast): uvwa[:,i] += m[j]*xyza_ij[:,i,j]*dt/ra_ij[i,j]**3 xyz += uvw*dt xyza += uvwa*dt xyzs.append(xyz.tolist()) xyzas.append(xyza.tolist()) xyzs = np.array(xyzs).transpose(2,1,0) xyzas = np.array(xyzas).transpose(2,1,0) def animate(n): for i in range(len(m)): xyz = xyzs[i] traces[i].set_data(xyz[0,:n],xyz[1,:n]) traces[i].set_3d_properties(xyz[2,:n]) pts[i].set_data(xyz[0,n],xyz[1,n]) pts[i].set_3d_properties(xyz[2,n]) for i in range(N_ast): pt_asts[i].set_data(xyzas[i,0,n],xyzas[i,1,n]) pt_asts[i].set_3d_properties(xyzas[i,2,n]) return traces+pts+pt_asts ani = animation.FuncAnimation(fig, animate, range(N), interval=10, blit=True) plt.show() ani.save(name)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python Pygame實(shí)戰(zhàn)之水果忍者游戲的實(shí)現(xiàn)
大家還記得水果忍者這個游戲嗎?想當(dāng)年,這也是個風(fēng)靡全國的游戲,基本每個人都玩過。今天小編就用Python中的Pygame庫復(fù)刻這一經(jīng)典游戲,需要的可以參考一下2022-02-02基于Python實(shí)現(xiàn)銀行卡識別的示例代碼
銀行卡識別是一個在金融、安全等領(lǐng)域具有重要應(yīng)用的問題,本文主要為大家介紹了如何使用Python和深度學(xué)習(xí)技術(shù)來實(shí)現(xiàn)銀行卡識別功能,需要的可以參考下2024-03-03Anaconda安裝之后Spyder打不開解決辦法(親測有效!)
這篇文章主要給大家介紹了關(guān)于Anaconda安裝之后Spyder打不開解決辦法,文中將解決的過程介紹的非常詳細(xì),親測有效,對同樣遇到這個問題的朋友具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2023-04-04利用PyCharm操作Github(倉庫新建、更新,代碼回滾)
這篇文章主要介紹了利用PyCharm操作Github(倉庫新建、更新,代碼回滾),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12python3.5基于TCP實(shí)現(xiàn)文件傳輸
這篇文章主要為大家詳細(xì)介紹了python3.5基于TCP實(shí)現(xiàn)文件傳輸?shù)拇a,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07在Linux中通過Python腳本訪問mdb數(shù)據(jù)庫的方法
這篇文章主要介紹了在Linux中通過Python腳本訪問mdb數(shù)據(jù)庫的方法,本文示例基于debian系的Linux系統(tǒng),需要的朋友可以參考下2015-05-05Python通過getattr函數(shù)獲取對象的屬性值
這篇文章主要介紹了Python通過getattr函數(shù)獲取對象的屬性值,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10基于Python實(shí)現(xiàn)文件的壓縮與解壓縮
在日常工作中,除了會涉及到使用Python處理文本文件,有時候還會涉及對壓縮文件的處理。本文為大家總結(jié)了利用Python可以實(shí)現(xiàn)的幾種文件壓縮與解壓縮實(shí)現(xiàn)代碼,需要的可以參考一下2022-03-03利用Python第三方庫實(shí)現(xiàn)預(yù)測NBA比賽結(jié)果
今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識,文章圍繞著利用Python實(shí)現(xiàn)預(yù)測NBA比賽結(jié)果展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06