Pythonで ヘビのアニメ- 4 (完成版)

ヘッダー下のアニメです。結局「ヘビのアニメ- 3」を改良してカエルが跳ねて逃げるようにしました。アニメ(再掲)とソースコードを載せます。Python 開発環境でご試用してください。なお、画像貼り付けだけでは、WPが勝手にリサイズして動かなかったので、画像ブロックのHTMLを編集し、画像ファイル名をメディアライブラリに入れた元の名前にしたところ、動くようになりました。

ヘビとカエル3
# hebi230309.py
# ヘビとカエルのアニメ(完成版)
# 2023.03.09 by Kero

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig = plt.figure(figsize=(20,1.3)) # figsizeはWordPressのヘッダー下の図の密度による。
plt.xlim(10,100) # ヨコに長いグラフにする。
plt.xticks([]) # x軸目盛りを消去。
plt.yticks([]) # y軸目盛りを消去。


film = [] # 空の映画フィルムを用意。
frog = np.array([[15., 16., 16.5, 15.],[0., 0., 0.4, 0.]]) # カエルの胴体。
feye = np.array([[15.8],[0.34]]) # カエルの目玉。

for i in range(500): # ヘビのニョロニョロとカエルの動作。
    j = i / 5
    x = np.linspace(j, j+3.5*np.pi,100) # ヘビの長さ。
    y = np.sin(x) # ヘビはサインカーブが元。
    for k in range(100): # ヘビの全身について。
        y[k] = (y[k] + 1) * (0.35 + 0.0065 * k) # ヘビの頭は大きく、尾は小さく。
    hebi = plt.plot(x, y, c='darkorchid', lw=6) # ニョロニョロを描く。hebiというオブジェクトに。

    if (x[-1]<100) and (x[-1] > frog[0][0] - 2): # もし、枠内でヘビの頭がカエルに近づいたら。
        pyn = 5* np.random.rand() + 3 # カエルの移動距離を3以上8未満にランダムに設定。
        pyn2 = 0.65 * pyn # 跳び上がりの頂点のは移動距離中央よりちょっと右にした方がリアル?
        frogpx = frog[0] + pyn2 # 跳躍頂点のx座標。
        frogpy = frog[1] + 0.4 # 跳躍頂点のy座標。高さ0.4。
        feyepx = feye[0] + pyn2 # 目玉x座標もそれに合わせる。
        feyepy = feye[1] + 0.43 # 目玉y座標も同上。0.03だけ目玉を飛び出させる。誰も気にしないけど。
        pyonpb = plt.plot(frogpx,frogpy,c='g',lw=3) # 跳躍頂点でのカエル胴体の描画。オブジェクト化。
        pyonpe = plt.plot(feyepx,feyepy, 'o', c='k', markersize=4) # 目玉も同上。
    else: # ヘビの頭からカエルまで遠かったら。
        pyn = 0 # カエルの移動距離=0。
        pyonpb = plt.plot(0,0,'o',c='w') # これがないとzenbuでエラーとなる。
        pyonpe = plt.plot(0,0,'o',c='w') # 同上。
        
    if x[-1] > 100: # もしヘビの頭が右枠を超えたら。
        frog = np.array([[15., 16., 16.5, 15.],[0., 0., 0.4, 0.]]) # カエルは元の左に戻る。
        feye = np.array([[15.8],[0.34]]) # 目玉も同上。

    frog[0] = frog[0] + pyn # カエルの胴体のx座標。1コマ前から移動距離分たす。
    feye[0] = feye[0] + pyn # 目玉のx座標も同じ。
    frog2 = plt.plot(frog[0], frog[1], c='g',lw=3) # カエル胴体描画。オブジェクト化。
    feye2 = plt.plot(feye[0], feye[1], 'o', c='k', markersize=4) # 目玉も同上。
    zenbu = hebi + frog2 + feye2 + pyonpb + pyonpe # オブジェクトを合算。
    film.append(zenbu) # 1コマをフィルムに描き込む。

anim = animation.ArtistAnimation(fig, film, interval=100) # filmをアニメ表示する呪文。オブジェクト化。
anim.save('hebi-0309-2.gif', writer='pillow') # オブジェクト「anim」をgif形式で保存。
plt.show() # 「絵よ出ろ!」の呪文。

コメントを残す

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