资讯专栏INFORMATION COLUMN

你们要的3D太阳系

MadPecker / 1862人阅读

摘要:用画一个平面的太阳系得到一些朋友的欣赏,然后有同学提出了绘制三维太阳系的要求。从画图的角度来说,三维太阳系其实并不难,问题在于八大行星对黄道面的倾斜太小,所以尽管画个三维的图,但就观感而言,无非是把二维的嵌入到三维空间罢了。

用Python画一个平面的太阳系得到一些朋友的欣赏,然后有同学提出了绘制三维太阳系的要求。

从Python画图的角度来说,三维太阳系其实并不难,问题在于八大行星对黄道面的倾斜太小,所以尽管画个三维的图,但就观感而言,无非是把二维的嵌入到三维空间罢了。

来点小行星

代码如下

from os import cpu_countimport numpy as npfrom numpy.random import randimport matplotlib.pyplot as pltfrom matplotlib import animationau,G,RE,ME = 1.48e11,6.67e-11,1.48e11,5.965e24m = np.array([3.32e5,0.055,0.815,1,0.107,317.8])*ME*Gr = np.array([0,0.387,0.723,1,1.524,5.203])*REv = np.array([0,47.89,35.03,29.79,24.13,13.06])*1000theta = rand(len(m))*np.pi*2cTheta,sTheta = np.cos(theta), np.sin(theta)xyz = r*np.array([cTheta, sTheta, 0*r])     #位置三分量,因为参数太多,所以把这三个分量写在了一起uvw = v*np.array([-sTheta, cTheta, 0*v])    #速度三分量N_ast = 100m_ast = rand(N_ast)*1e20r_ast = (rand(N_ast)*3.5+1.6)*REv_ast = np.sqrt(G*3.32e5*ME/r_ast)  #小行星速度sqrt(GM/R)theta = rand(N_ast)*np.pi*2phi = (rand(N_ast)-0.5)*0.3     #给一个随机的小倾角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 = 500dt = 3600*50ts =  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_astsani = animation.FuncAnimation(fig, animate,     range(N), interval=10, blit=True)plt.show()ani.save(name)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122575.html

相关文章

  • 用Python搓一个阳系

    ... 文章目录 日地月三体日地火阳系 你们要的3D阳系 图片上传之后不知为何帧率降低了许多。。。 日地月三体 所谓三体,就是三个物体在重力作用下的运动。由于三点共面,所以三个质点仅在重...

    shaonbean 评论0 收藏0
  • 12个令人惊叹的CSS实验项目

    ...看这些惊人的纯CSS实验,也许你自己也可以尝试一下。 阳系 哇! 如果你喜欢太空,一定会被这个用 CSS 实现的的阳系动画效果所震撼。 这不仅仅是一个漂亮的动画; 相对于真实的地球年,每个行星都能准确地围绕太阳旋转...

    LiuZh 评论0 收藏0
  • 12个令人惊叹的CSS实验项目

    ...看这些惊人的纯CSS实验,也许你自己也可以尝试一下。 阳系 哇! 如果你喜欢太空,一定会被这个用 CSS 实现的的阳系动画效果所震撼。 这不仅仅是一个漂亮的动画; 相对于真实的地球年,每个行星都能准确地围绕太阳旋转...

    wow_worktile 评论0 收藏0
  • 12个令人惊叹的CSS实验项目

    ...看这些惊人的纯CSS实验,也许你自己也可以尝试一下。 阳系 哇! 如果你喜欢太空,一定会被这个用 CSS 实现的的阳系动画效果所震撼。 这不仅仅是一个漂亮的动画; 相对于真实的地球年,每个行星都能准确地围绕太阳旋转...

    CastlePeaK 评论0 收藏0
  • WebGL three.js学习笔记 纹理贴图模拟阳系运转

    纹理贴图的应用以及实现一个阳系的自转公转 点击查看demo演示 demo地址:https://nsytsqdtn.github.io/d... three.js中的纹理 纹理贴图是通过将图像应用到对象的一个或多个面,来为3D对象添加细节的一种方法。可以使用TextureLoader类...

    Pandaaa 评论0 收藏0

发表评论

0条评论

MadPecker

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<