# makizushi-05.py 2023.03.22 by Kero
# 最終目標は「巻きずしを作る3Dアニメ」です。
# 5. 2次元「巻きずし」巻きアニメ (makizushi-05.py)
# ①まず、らせんの最外端が常に原点に来るように、らせんを描きながら平行移動させます。
# ②次に、各コマでらせんになった最外端の線分の長さだけ右へ平行移動させます。
# 前回のソースコードの解説(コメント文)を消し、今回の解説をします。
import sys
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
pi = np.pi
imgs = []
# らせんの計算
maki = 3
r0 = 1
a = 2
kaku0 = 2 * pi * r0 / a
ara = 12
pon = maki * ara + 1
kaku = np.linspace(0, 2 * pi * maki, pon)
kakut = kaku + kaku0
r = a * kakut / (2 * pi)
x = r * np.cos(kakut)
y = r * np.sin(kakut)
# グラフ化
fig, ax = plt.subplots(figsize=(15,5)) # 図を少し大きくしました。
ax.set_aspect('equal')
ax.grid()
ax.set_xlim(-10,100) # ②らせんが右に転がるのでx軸を延長。
ax.set_ylim(-1,15) # ①各点のy座標はゼロ以上。
ax.scatter(0,0, c='r')
sld = 0 # ②らせんに加わった最外端の点とその一つ前の点との距離を集積する。
for i in range(1,pon+1):
rkak = -kakut[i-1] - pi/2
xr = x[:i] * np.cos(rkak) - y[:i] * np.sin(rkak)
yr = x[:i] * np.sin(rkak) + y[:i] * np.cos(rkak)
xr0 = xr - xr[i-1] # ①最外端のx座標分をすべての点から引く。
yr0 = yr - yr[i-1] # ①最外端のy座標分をすべての点から引く。
sld += np.sqrt(xr0[i-2]**2 + yr0[i-2]**2) # ②2点間距離を集積。
# i=1 のときi-2=-1となるけど、xr0[-1]は、配列xr0の最後尾の要素となる。
xr0 = xr0 + sld # ②らせん上のすべての点をsld分だけ右へ移動。
# ②これで「巻きずし」を巻いているように見える。
img = ax.plot(xr0, yr0, c='b')
imgs.append(img)
anime = animation.ArtistAnimation(fig, imgs, interval=200) # ②200ミリ秒間隔。
plt.show()
plt.close()
sys.exit()