[matplotlib animation] 15. 内サイクロイド(hypocycloid)

matplotlib Animation

はじめに

matplotlib FuncAnimationによる内サイクロイドのアニメーションについて解説する。

コード

コードをダウンロード

解説

モジュールのインポート

グリッドと軸ラベル、アスペクト比の設定

データの生成

内サイクロイドは極座標系の媒介変数でデータを生成する。
θを0〜4π,φを0〜2πとする。

内サイクロイド

固定円の半径をrc, 動円の半径をrm, 回転角を θとすると内サイクロイドは以下の式で表される。

$$x=(r_c – r_m)cos\theta +r_m cos( \frac{r_c – r_m}{r_m}\theta)\\ y=(r_c – r_m)sin\theta -r_m sin( \frac{r_c – r_m}{r_m}\theta)$$

内サイクロイドを表示するための空のリスト、hypocycloids =[]をつくる。
points円周上の定点を表示するための空のリスト、points=[]もつくる。

動く円

回転する円をプロットするため、円を媒介変数のx,yで設定する。円をアニメーション表示するために空のリスト、round_circles =[]をつくる。

内円を外円に沿って移動させるための設定。内円は半径=(rc-rm)の円運動をするので上記のようになる。

固定円

固定円はアニメーションで動かないのでここでplotしておく。

アニメーションの設定

アニメーションでは古いプロットを消す必要があるので、
グラフのリストにグラフが入っている場合は、pop().remove()で消す。

round_circle, = plt.plot(x_move[num]+xm, y_move[num]+ym, ‘b-‘, lw=2)
で、内側の円がぐるりと円運動するアニメーションとして表示する。b-で青い線での表示となる。

hypocycloid, = plt.plot(x[:num+1] ,y[:num+1], ‘g-‘, lw=2)
で、内サイクロイドの軌跡を表示する。g-で緑線での表示となる。

point, = plt.plot(x[num], y[num], ‘ko’, markersize=4)
で内側の円の定点を表示している。koで黒丸での表示となる。

それぞれ作成したプロットをからのリストに入れることでアニメーションを表示できる。

ax.set_title(theta_str + str(theta[num]/np.pi)[:4] + str(r’ $\pi$’))でタイトルにアニメーションで変化する回転角を表示する。πを表示するには、r’ $\pi$’とする。

アニメーションの表示

FuncAnimationでanimationの表示。updateを200step実行してアニメーションとする。intervalは100 ms なので20秒のアニメーションとなる。
HTML(ani.to_html5_video())でjupyter notebook上にアニメーションを表示できる。

アニメーションの保存

ani.save(‘filename.mp4’, writer=”ffmpeg”,dpi=dpi)でアニメーションを保存することができる。dpiを設定することで指定の解像度での保存が可能。

参考

サイクロイド - Wikipedia
ハイポサイクロイド(内サイクロイド)hypocycloid - CinderellaJapan
Cinderella Site in Japan ( The Interactive Geometry Software Cinderella )

コメント