你们要的Python绘画3D太阳系详细代码

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

从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])     #位置三分量,因为参数太多,所以把这三个分量写在了一起
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     #给一个随机的小倾角
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)

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

时间: 2021-10-13

如何利用Python动态模拟太阳系运转

前言 提到太阳系,大家可能会想到哥白尼和他的日心说,或是捍卫.发展日心说的斗士布鲁诺,他们像一缕光一样照亮了那个时代的夜空,对历史感兴趣的小伙伴可以深入了解一下,这里就不多说了. 太阳以巨大的引力使周边行星.卫星等绕其运转,构成了太阳系,它主要包括太阳.8 个行星.205 个卫星以及几十万个小行星等,本文我们使用 Python 来简单的动态模拟一下太阳系的运转. 实现 功能的实现,主要要到的还是 Python 的 pygame 库,我们先导入需要的所有 Python 库,代码如下所示: impo

Python turtle绘画象棋棋盘

通过使用turtle绘画象棋棋盘,供大家参考,具体内容如下 # 绘制象棋棋盘 import turtle t = turtle.Pen() t.width(2) # 设置画笔粗细 t.speed(1) # 设置画笔移动速度 # 画竖线 t.penup() t.goto(-400, -400) for i in range(9): t.pendown() if i != 0 and i != 8: t.goto(-400+i*100, 0) t.penup() t.goto(-400+i*100,

Python趣味挑战之turtle库绘画飘落的银杏树

一.导入所需的库 import turtle import random from math import * 二.生成斐波那契数列 斐波那契数列是指前两项的和加起来等于后一项的一个数列,这里使用了两个函数来生成斐波契那数列. def Fibonacci_Recursion_tool(n): #斐波那契数列方法 if n <= 0: return 0 elif n == 1: return 1 else: return Fibonacci_Recursion_tool(n - 1) + Fibo

使用python的turtle绘画滑稽脸实例

这是借鉴了一位兄弟的代码,然后进行修改的,原来代码存在问题,用了2小时,自己修改,终于画出了滑稽脸,也算是对于今天学的turtle绘画库的一个小小的记录吧!(有错误希望各位看官指正啊) 编译器是:Atom python 是3.7版本 运行位 Windows power shell import turtle turtle.setup(600,600,200,200) #fcae turtle.penup() turtle.goto(-210,0) turtle.seth(-90) turtle.

python openCV自制绘画板

本文实例为大家分享了python openCV自制绘画板的具体代码,供大家参考,具体内容如下 import numpy as np import cv2 def nothing(x): pass cv2.namedWindow('image') img = np.zeros((512,512,3),np.uint8) cv2.createTrackbar('R','image',0,255,nothing) cv2.createTrackbar('G','image',0,255,nothing

Python OpenCV 直方图的计算与显示的方法示例

本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途什么的就直接略过去了.这里直接介绍方法. 计算并显示直方图 与C++中一样,在Python中调用的OpenCV直方图计算函数为cv2.calcHist. cv2.calcHist的原型为: cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]]) #返回his

Python图像处理之简单画板实现方法示例

本文实例讲述了Python图像处理之简单画板实现方法.分享给大家供大家参考,具体如下: Python图像处理也是依赖opencv的Python接口实现的,Python语言简单易懂,简洁明了.本次实现画板涂鸦,一个是在里面画矩形,还有画线.其他也都可以扩展,本案例只做例程,思路是对鼠标事件的处理,以及滚动条调节颜色处理.鼠标事件就包含有左键按下,以及释放事件的处理. import cv2 import numpy as np # null function def nothing(x): pass

Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色

!!!本博客,是对图像的背景颜色的修改的基础讲解~!!! 还包括一个练习--是对背景色修改的一点应用尝试!!!--始终相信学习多一点探索,脚步会更坚定一些~ 愿所有正在努力的人都可以坚持自己的路一直走下去! 实现轨迹(跟踪)栏功能的函数 函数主要参数讲解 cv.createTrackbar()--创建一个轨迹(跟踪)栏 cv.getTrackbarPos()--获取一个轨迹(跟踪)栏的值 cv.createTrackbar()参数如下: 参数一:trackbarname--轨迹(跟踪)栏名称 参

Python+Opencv身份证号码区域提取及识别实现

前端时间智能信息处理实训,我选择的课题为身份证号码识别,对中华人民共和国公民身份证进行识别,提取并识别其中的身份证号码,将身份证号码识别为字符串的形式输出.现在实训结束了将代码发布出来供大家参考,识别的方式并不复杂,并加了一些注释,如果有什么问题可共同讨论.最后重要的事情说三遍:请勿直接抄袭,请勿直接抄袭,请勿直接抄袭!尤其是我的学弟学妹们,还是要自己做的,小心直接拿我的用被老师发现了挨批^_^. 实训环境:CentOS-7.5.1804 + Python-3.6.6 + Opencv-3.4.

python+opencv实现的简单人脸识别代码示例

# 源码如下: #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv def detect_object(image): '''检测图片,获取人脸在图片中的坐标''' grayscale = cv.CreateImage((image.width, image.height), 8, 1) cv.CvtColor(image, grayscale, cv.CV_BGR2GR

python+opencv实现动态物体识别

注意:这种方法十分受光线变化影响 自己在家拿着手机瞎晃的成果图: 源代码: # -*- coding: utf-8 -*- """ Created on Wed Sep 27 15:47:54 2017 @author: tina """ import cv2 import numpy as np camera = cv2.VideoCapture(0) # 参数0表示第一个摄像头 # 判断视频是否打开 if (camera.isOpened()

python opencv之SURF算法示例

本文介绍了python opencv之SURF算法示例,分享给大家,具体如下: 目标: SURF算法基础 opencv总SURF算法的使用 原理: 上节课使用了SIFT算法,当时这种算法效率不高,需要更快速的算法.在06年有人提出了SURF算法"加速稳定特征",从名字上来看,他是SIFT算法的加速版本. (原文) 在SIFT算法当中使用高斯差分方程(Difference of Gaussian)对高斯拉普拉斯方程( Laplacian of Gaussian)进行近似.然而,SURF使

python OpenCV学习笔记之绘制直方图的方法

本篇文章主要介绍了python OpenCV学习笔记之绘制直方图的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 官方文档 – https://docs.opencv.org/3.4.0/d1/db7/tutorial_py_histogram_begins.html 直方图会让你对图像的强度分布有一个全面的认识.它是一个在x轴上带有像素值(从0到255,但不总是),在y轴上的图像中对应的像素数量的图. 这只是理解图像的另一种方式.通过观察图像的直方图,你可以直

python OpenCV学习笔记实现二维直方图

本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d_histogram.html 在前一篇文章中,我们计算并绘制了一维的直方图.它被称为一维,因为我们只考虑一个特性,即像素的灰度强度值.但是在二维直方图中,你可以考虑两个特征.通常它用于寻找颜色直方图,其中两个特征是每个像素的色调和饱和度值. 有一个python样例(samples/python/c

python opencv之SIFT算法示例

本文介绍了python opencv之SIFT算法示例,分享给大家,具体如下: 目标: 学习SIFT算法的概念 学习在图像中查找SIFT关键的和描述符 原理: (原理部分自己找了不少文章,内容中有不少自己理解和整理的东西,为了方便快速理解内容和能够快速理解原理,本文尽量不使用数学公式,仅仅使用文字来描述.本文中有很多引用别人文章的内容,仅供个人记录使用,若有错误,请指正出来,万分感谢) 之前的harris算法和Shi-Tomasi 算法,由于算法原理所致,具有旋转不变性,在目标图片发生旋转时依然