はじめに
matplotlibのFuncAnimationで斜方投射のアニメーションをロケットの画像を用いて表示する。ロケットは常に進行方向を向くようにskimage.transform.rotateで回転させる。
コード
解説
モジュールのインポートなど
バージョン
時間の設定
np.arangeで18 sまで0.05刻みで時間データを作成する。配列のサイズは360となる。
重力加速度は9.8 m/sとした。
初期位置と初速度の設定
初期位置を(0,0)とした場合、初速度を100として打ち上げる。
v_x、v_yで45°(π/4)で投射したときの横方向、縦方向の速度をそれぞれ求める。
位置の変化
x,yで横方向、縦方向の位置の変化をそれぞれ求める。
角度の計算
np.arctanで2点のなす角度を計算する。図示すると以下のようになる。
![](https://sabopy.com/wp/wp-content/uploads/2020/06/time_angle1.jpg)
skimageのrotateに適用させるため、データを反転させる。図示すると以下のようになる。
![](https://sabopy.com/wp/wp-content/uploads/2020/06/time_angle2.jpg)
地面に到着する時間
t0で地面に到着する時間を求める。
地面に到着する時間のインデックスもnp.argmin(np.abs(t-t0))で求める。
データのスライス
データの表示
画像の読み込み
plt.imread(image)で画像を読み込む。画像は下記サイトのものを用いた。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTniQJxjCYr0zX9RW5qZVYQKBzKCXh1Tfd5w5I6p2cnuYUcek6wbP71JUdepQ1rFwp48VGurGWtBsIm7PF2WhNpTGjpg3uWnmZX1xe7NzlTapN0IPkzEgAzwn1KMlM2N3djqEnf500fwg/s400/space_rocket.png)
この画像は斜めに傾いたロケットなので、下記記事と同様に方法で画像を回転し、上を向いたロケットの画像を読み込んだ。
![](https://sabopy.com/wp/wp-content/uploads/2020/06/space_rockets-160x90.jpg)
プロットの表示
画像をOffsetImage(image, zoom=.1)でOffsetImageとし、AnnotationBboxで(x[0], y[0]+10)の位置に表示する。図に表示するためにax.add_artist(annotation)とする。
![](https://sabopy.com/wp/wp-content/uploads/2020/06/rocket_xy.jpg)
アニメーションで表示
transform.rotateで画像の角度を進行方向に向ける。回転した画像をOffsetImageで読み込み、annotation.xybox = (x[i],y[i]+10)で画像の位置を変化させる。
annotation.offsetbox = im_rrでannotationの画像を回転した画像に変更する。
FuncAnimationでアニメーションを表示する。frame数をt.shape[0]-1、intervalを20msとし、6秒弱のアニメーションとする。 HTML(ani.to_html5_video())
により、jupyter notebook またはjupyter lab上にアニメーションを表示できる。
ani.save(‘ファイル名’, writer=”ffmpeg”,dpi=100)でアニメーションをMP4形式で保存することができる。
参考
![](https://sabopy.com/wp/wp-content/uploads/2018/11/cg-160x90.png)
コメント