1"""
2SATURN
3"""
4
5import numpy as np
6import matplotlib.pyplot as plt
7from math import sin, cos, radians, sqrt
8
9plt.axis([0,150,100,0])
10plt.axis('off')
11plt.grid(False)
12
13print('running')
14#—————————————————parameters
15g=[0]*3
16
17xc=80 #———sphere center
18yc=50
19zc=0
20
21rs=25 #———sphere radius
22
23lx=-1 #———light ray unit vector components
24ly=0
25lz=0
26
27IA=0
28IB=.8
29+n=2
30
31Rx=radians(-20)
32Ry=radians(0)
33Rz=radians(30)
34
35#————————same as SHADESPHERE—————–
36
37#———————————————————rings
38alpha1=radians(-10)
39alpha2=radians(370)
40dalpha=radians(.5)
41
42r1=rs*1.5
43r2=rs*2.2
44dr=rs*.02
45deltar=(r2-r1)/7 #———ring band width
46
47#—————————————rotate ring point p which is at r, alpha
48for r in np.arange(r1,r2,dr):
49 for alpha in np.arange(alpha1,alpha2,dalpha):
50 xp=r*cos(alpha)
51 yp=0
52 zp=-r*sin(alpha)
53 rotx(xc,yc,zc,xp,yp,zp,Rx)
54 xp=g[0]-xc
55 yp=g[1]-yc
56 zp=g[2]-zc
57 roty(xc,yc,zc,xp,yp,zp,Ry)
58 xp=g[0]-xc
59 yp=g[1]-yc
60 zp=g[2]-zc
61 rotz(xc,yc,zc,xp,yp,zp,Rz)
62 xpg=g[0]
63 ypg=g[1]
64
65#—————————————————select ring band color
66 if r1 <= r < r1+1*deltar:
67 clr=(.63,.54,.18)
68 if r1+1*deltar <= r <= r1+2*deltar:
69 clr=(.78,.7,.1)
70 if r1+2*deltar <= r <= r1+3*deltar:
71 clr=(.95,.85,.1)
72 if r1+3*deltar <= r <= r1+4*deltar:
73 clr=(.87,.8,.1)
74 if r1+5*deltar <= r <= r1+7*deltar:
75 clr=(.7,.6,.2)
76
77#———————————————————————shadow
78 magu=sqrt(lx*lx+ly*ly+lz*lz)
79 ux=-lx/magu
80 uy=-ly/magu
81 uz=-lz/magu
82 vx=xc-xpg
83 vy=yc-ypg
84 vz=zc-zpg
85 Bx=uy*vz-uz*vy
86 By=uz*vx-ux*vz
87 Bz=ux*vy-uy*vx
88 magB=sqrt(Bx*Bx+By*By+Bz*Bz)
89 if magB < rs: #—————————if in the shadow region
90 if vx*lx+vy*ly+vz*lz <= 0: #———if v points toward light source
91 clr=(.5,.5,.2) #———shadow color
92
93 if r1+4*deltar <= r <= r1+5*deltar: #———overplot empty band
94 clr='midnightblue' #———with background color
95
96#——————————————————–plot line segment
97 if alpha == alpha1:
98 xstart=xpg
99 ystart=ypg
100 if zpg <= zc: #–front (z axis points into the screen)
101 plt.plot([xstart,xpg],[ystart,ypg],linewidth=2,color=clr)
102
103 if zpg >= zc: #–back
104 a=xpg-xc
105 b=ypg-yc
106 c=sqrt(a*a+b*b)
107 if c > rs*1.075: #——plot only the visible portion of rings
108 plt.plot([xstart,xpg],[ystart,ypg],linewidth=2,color=clr)
109 xstart=xpg
110 ystart=ypg
111
112plt.show()