初めての「らせんアニメ」3. 代数らせん


2022.06.03 → 06.04 修正 → 06.07 修正2

3番目のらせんアニメです。
やっと、代数らせんのアニメができましたが、巻いた後に展開するとき、途中で終わる不備があったので、それを修正しました。
画像表示の縦横サイズが制御できず、真円になっていません。img文に入れても、cssで指定してもダメでした。検討中。 → 06.07 修正しました。
ソースコードは Python 開発環境で試行してください。
coil-3R2

【Python】

# らせんアニメ-3 coil-3-0604-1.py 巻き戻しの不備(57番目以降) を修正
# 回転角に比例してらせん中心からの距離が長くなるらせんを「等差らせん」とする。
# 接線の傾きをらせんの回転角とする。
# 各点における接線の傾きは点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(figsize=(10.0, 2.0))
artists = []

ri = 0 # らせん中心と各点との距離。最初は100番目の点の値。
sp = 1 # 点間の距離
xi = np.linspace(0, 100, 101) # 各点のx座標の初期値。ゼロから100まで。
yi = [0.0] * 101 # 各点のy座標の初期値。すべてゼロ。
do = np.linspace(0, 100, 101)
a =  4 * np.sqrt(2) / np.pi # 回転角とらせん中心からの距離との比例定数

do[100] = 0.0

for i in range(100, 0, -1):
        do[i] = np.pi/2 - np.arctan2(ri, 1)
        ri = np.sqrt(np.square(ri) + np.square(sp))

for eachx in range(101, 0, -1):
        for mag in range(100,eachx-1, -1):
                xsa = xi[mag] - xi[eachx-1]
                ysa = yi[mag]
                the = np.arctan2(ysa, xsa)
                kyo = np.sqrt(np.square(xsa) + np.square(ysa))
                kai = the + do[eachx -1]
                xi[mag] = xi[eachx-1] + kyo * np.cos(kai)
                yi[mag] = yi[eachx-1] + kyo * np.sin(kai)
        artist = ax.plot(xi,yi,"blue")
        artists.append(artist)

for eachx in range(0, 101, 1):
        for mag in range(eachx+1, 101, 1):
                xsa = xi[mag] - xi[eachx]
                ysa = yi[mag] - yi[eachx]
                the = np.arctan2(ysa, xsa)
                kyo = np.sqrt(np.square(xsa) + np.square(ysa))
                kai = the -do[eachx]
                xi[mag] = xi[eachx] + kyo * np.cos(kai)
                yi[mag] = yi[eachx] + kyo * np.sin(kai)
#                 print(eachx, mag, kyo, kai, xi[mag], yi[mag])
        artist = ax.plot(xi,yi,"blue")
        artists.append(artist)

anim = ArtistAnimation(fig, artists, interval=50)
anim.save("coil-3R2.gif", writer="pillow")

# plt.show()    

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です