用python画出地球绕太阳的运动图

EARTH_SUN_PROGRAMME:

代码如下所示:

import matplotlib. pyplot as plt
import numpy as np
from math import *

plt. axis([-100,150,-100,150])
plt.grid(False)
plt.axis('off')
sfx = 2.5/3.8

# ----------------background

for x in range(-100, 150, 2):
    for y in range(-100, 150, 2):
        plt.scatter(x, y, s=40, color='midnightblue')
        # x,y:表示的是shape大小为(n, )的数组,也就是我们即将绘制散点图的数据点,输入数据。
        # s:表示的是大小,是一个标量或者是一个shape大小为(n, )的数组,可选,默认20。

phimin = 0.
phimax = 2. * np.pi
dphi = phimax/100.

rs = 40.
re = 20.
ys = 15.
ye = 2.
xos = 50.
yos = 0.
zos = 0.

# -------------Sun's core
plt.scatter(xos,yos,s=4300,color='yellow' ) #
# -----Sun horizontals
rx=radians(20)
for ys in np.arange(-rs,rs,5):
    for phi in np.arange(phimin,phimax, dphi):
        rp=np.sqrt(rs*rs-ys*ys)
        xp=rp*np.sin(phi)
        yp=ys
        zp=rp*np.cos(phi)
        px=xos +sfx*xp*1. +yp*0. +zp*0.
        py=yos +xp*0. +yp*np.cos(rx) -zp*np.sin(rx)
        pz=zos +xp*0. +yp*np.sin(rx) +zp*np.cos(rx)
        if pz>0:
            plt. scatter(px,py,s=1,color='red')

# ------------------Sun verticals

alphamin=0.

alphamax=2. *np.pi

dalpha=alphamax/30.

for alpha in np. arange(alphamin,alphamax,dalpha):
    for phi in np.arange(phimin,phimax, dphi):
        xp=rs*np.sin(phi)*np.sin(alpha)
        yp=rs*np. cos(phi)
        zp=rs*np. sin(phi)*np.cos(alpha)
        px=xos +sfx*(xp*1. +yp*0. +zp*0.)
        py = yos + xp * 0. + yp * np.cos(rx) - zp * np.sin(rx)
        pz = zos + xp * 0. + yp * (np.sin(rx)) + zp * np.cos(rx)
        if pz > 0:
            plt.scatter(px, py, s=1, color='red')
# -----------------Earth's clouds
xoe = -50.
yoe = 20.
zoe = -10.
plt.scatter(xoe, yoe, s=800, color='white')
# ---------Earth horizontals
rx = 20. * np.pi / 180.
dphi = phimax / 100.
for ys in np.arange(-re, re, 2):
    for phi in np.arange(phimin, phimax, dphi):
        rp = np.sqrt(re * re - ys * ys)
        xp = rp * np.sin(phi)
        yp = ys
        zp = rp * np.cos(phi)
        px = xoe + sfx * (+xp * 1. + yp * 0. + zp * 0.)
        py = yoe + xp * 0. + yp * np.cos(rx) - zp * np.sin(rx)
        pz = zoe + xp * 0. + yp * (np.sin(rx)) + zp * np.cos(rx)

        if pz > 0:
            plt.scatter(px, py, s=.1, color='#add8e6')
# -------------Earth verticals
alphamin = 0.
alphamax = 2. * np.pi
dalpha = alphamax / 30.
for alpha in np.arange(alphamin, alphamax, dalpha):
    for phi in np.arange(phimin, phimax, dphi):
        xp = re * np.sin(phi) * np.sin(alpha)
        yp = re * np.cos(phi)
        zp = re * np.sin(phi) * np.cos(alpha)
        px = xoe + sfx * (xp * 1. + yp * 0. + zp * 0.)
        py = yoe + xp * 0. + yp * np.cos(rx) - zp * np.sin(rx)
        pz = zoe + xp * 0. + yp * (np.sin(rx)) + zp * np.cos(rx)
        if pz > 0:
            plt.scatter(px, py, s=.1, color='#add8e6')
plt.arrow(xos - rs * sfx - 3, yos+2, xoe-(xos - rs * sfx) + re + 3, yoe - yos - 6.2, color='r', head_length=4., head_width=3.)
plt.text(-14, 16, '1 AU', color='white')
plt.text(80, -29, 'Sun', color='white')
plt.text(-84, 10, 'Earth', color='white')
# -------------- front  orbit
deltamin=0. *np.pi/180.
deltamax=195.*np.pi/180.
ddelta=deltamax/60.
for delta in np.arange(deltamin,deltamax, ddelta):
    r = 108./sfx
    xp = r*np.cos(delta)
    yp = 0.
    zp = r*np.sin(delta)
    px = xos + sfx*(xp*1. + yp*0. + zp*0.)
    py = yos + xp*0. + yp*np.cos(rx) - zp*np.sin(rx)
    pz = zos + xp*0. + yp*(np.sin(rx)) + zp*np.cos(rx)
    plt. scatter(px, py, s=1, color='white')

# ---------------------back orbit
deltamin=220. *np. pi/180.
deltamax=360. *np . pi/180.
for delta in np . arange(deltamin, deltamax, ddelta):
    r = 108./sfx
    xp = r*np. cos(delta)
    yp = 0.
    zp = r*np.sin(delta)
    px = xos + sfx*xp*1. + yp*0. + zp*0.
    py = yos + xp*0. + yp*np .cos(rx) - zp*np.sin(rx)
    pz = zos + xp*0. + yp*(np.sin(rx)) + zp*np.cos(rx)
    plt.scatter(px, py, s=1, color='white')
# ------------------------Ap disc
xoc=xoe+re*sfx
yoc=yoe-2.5
zoc=zoe
rc= .83*re
phi1=0
phi2=2*np.pi
dphi=(phi2-phi1)/200
ry=-25*np.pi/180
for phi in np.arange(phi1,phi2,dphi):
    xc=xoc
    yc=rc*np.sin(phi)
    zc=rc*np.cos(phi)
    px=xoc+zc*np.sin(ry)
    py=yoc+yc
    pz=zoc+zc*np.cos(ry)
    plt.scatter(px, py, s=.03, color='white' )
plt.scatter(xoe+re*sfx, yoe-2, s=6,color='white')
plt.arrow(-20, 60, (xoe+re*sfx)+24,(yoe+re/2)-60-2.,color='white',linewidth=.5, head_width=2., head_length=3)
plt.text(-18, 60, 'Ap', color='white')
plt.title('EARTH_SUN_PROGRAMME')
plt.show()

运行结果如下:

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐