球面を動く芋虫

最近アニメーションを表示出来るようになった。

折角なので、何かをお絵かきしたい。

その前に、球面に虫がいる場面を考える。

  • 球面上の点は、θとφの2つの変数で管理することが出来る。
  • θ方向に一定の速度で動かしつつ、φ方向に一定の速度で動かすことを考える。
  • 球面上を動かす芋虫が、同じ点に戻ってくるとは、どういうことか。
    • 球面は、北極に行くと、経度が0でも180でも、何でも良くなる。
    • 全ての経線が交叉するから。
      • 北極点と南極点
  • 所々円筒っぽく!
    • 0~πで、両端は分離している。
    • ここがトーラスと違う。
    • トーラスっぽくするなら、θの値をπで割った余りとすることで出来る。
      • これは、トーラス上の運動の、球面表示となる。
      • 形を別の形として解釈する
        • 構造を保っていれば準同型。

お絵かきする。

球面を動くには、緯度と経度の変化率さえ指定すれば、後は勝手に動いてくれる。

#%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML
import numpy as np


theta = np.linspace(-2* np.pi, 3 * np.pi, 140)
phi = np.linspace(-5* np.pi, 2*np.pi,140)
x = 4 * np.cos(theta) * np.cos(phi)
y = 4 * np.cos(theta) * np.sin(phi)
z = 4 * np.sin(theta)


u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
a = 3.95 * np.outer(np.cos(u), np.sin(v))
b = 3.95 * np.outer(np.sin(u), np.sin(v))
c = 3.95 * np.outer(np.ones(np.size(u)), np.cos(v))

# Attaching 3D axis to the figure
fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111, projection='3d')
 
p1, = ax.plot(, , ,'o',markersize = 10,color='C3')
p2, = ax.plot(, , ,'o',markersize = 9,color='C3')
p3, = ax.plot(, , ,'o',markersize = 8,color='C3')
p4, = ax.plot(, , ,'o',markersize = 7,color='C3')
p5, = ax.plot(, , ,'o',color='C3')
p6, = ax.plot(, , ,'o',color='C3')
p7, = ax.plot(, , [],'o',color='C3')

ax.set(xlim=(-5,5),ylim=(-5,5),zlim=(-5,5))


# Plot the surface
ax.plot_surface(a, b, c,color="green",alpha = 0.1,rcount=100, ccount=100, antialiased=False)


def init():
    return p1,p2,p3,p4,p5

def update(i):

    p1.set_data*1
    p1.set_3d_properties(z[i+6])
    p1.set_alpha(1)
    p2.set_data*2
    p2.set_3d_properties(z[i+5])
    p2.set_alpha(6/7)
    p3.set_data*3
    p3.set_3d_properties(z[i+4])
    p3.set_alpha(5/7)
    p4.set_data*4
    p4.set_3d_properties(z[i+3])
    p4.set_alpha(4/7)
    p5.set_data*5
    p5.set_3d_properties(z[i+2])
    p5.set_alpha(3/7)
    p6.set_data*6
    p6.set_3d_properties(z[i+1])
    p6.set_alpha(2/7)
    p7.set_data*7
    p7.set_3d_properties(z[i])
    p7.set_alpha(1/7)

    return p1,p2,p3,p4,p5,p6,p7


ani = animation.FuncAnimation(fig, update, 96,interval=100)

plt.show()

f:id:medical-science:20220301191822p:plain



 

 

*1:x[i+6],y[i+6]

*2:x[i+5],y[i+5]

*3:x[i+4],y[i+4]

*4:x[i+3],y[i+3]

*5:x[i+2],y[i+2]

*6:x[i+1],y[i+1]

*7:x[i],y[i]