人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

你們要的Python繪畫3D太陽系詳細(xì)代碼

發(fā)布日期:2021-12-25 12:53 | 文章來源:源碼之家

用Python畫一個平面的太陽系得到一些朋友的欣賞,然后有同學(xué)提出了繪制三維太陽系的要求。

從Python畫圖的角度來說,三維太陽系其實并不難,問題在于八大行星對黃道面的傾斜太小,所以盡管畫個三維的圖,但就觀感而言,無非是把二維的嵌入到三維空間罷了。

來點小行星

代碼如下

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])  #位置三分量,因為參數(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)容!

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部