2023.02.11
アフィン変換の行列演算で線分を回転させてみました。スムーズに動くので、これを応用して「らせんアニメ」に挑戦してみます。ソースコードはPython 開発環境でお試しください。
# CS-1 螺旋部分2次元アニメ基礎検討その1 2023.02.11 by Kero
# 回転角に比例してらせん中心からの距離が長くなる「等差らせん」を作る。
# 接線の傾きをらせんの回転角とする。
# 各点における接線の傾きは点iから点i-1の傾きとする。
import sys
import signal
import time
import datetime
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
fig, ax = plt.subplots()
# fig, ax = plt.subplots()
ax.set_aspect('equal')
artists = []
# 図の作成。例えば、x軸に平行な線分。
xi = np.linspace(0,180,181)
yi = [0.] * 181
zi = [1.] * 181
zu = np.concatenate([[xi], [yi], [zi]])
plt.plot(zu[0], zu[1], c='r') # これで元の線分表示。
# 回転のマトリックス設定。
def A(rd):
Am = np.array([[np.cos(rd), -np.sin(rd), 0],
[np.sin(rd), np.cos(rd), 0],
[0., 0., 1.]])
return Am
# 例えば1°回転。
A01 = A(np.pi/180)
# 回転した図形表示。
for i in np.linspace(0, 2* np.pi,361):
Ai = A(i)
zu = np.dot(A01, zu)
artist= ax.plot(zu[0], zu[1], c='b')
artists.append(artist)
anim = ArtistAnimation(fig, artists, interval=30, repeat=True)
anim.save('kaiten-1.gif', writer='pillow')
plt.show()
plt.close()