Toy実験ように適当な軌跡のアニメーションが欲しかったので作った.
各frameをつくる:
import numpy as np import math import itertools import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation PI = math.pi # img_size is 2N x 2N (N, N) = (30, 30) def current_point(r, ang): x = r * math.cos( ang ) y = r * math.sin( ang ) return x, y def get_bar(cr, cang, dr, dang): fill_range = [] for r in np.arange(cr-dr, cr+dr, 0.02): for ang in np.arange(cang-dang, cang+dang, 0.02): (x,y) = current_point(r, ang) fill_range.append((x,y)) return fill_range def get_frames_for_circle(rad=0.65, lor=0.1): frames = [] for (k,t) in enumerate(np.arange(-2*PI,2*PI,0.1)): img_np = np.ones((2*N+1,2*N+1)) past_range = [ get_bar(rad, t-0.0, 0.10, lor), get_bar(rad, t-0.1, 0.09, lor), get_bar(rad, t-0.2, 0.08, lor), get_bar(rad, t-0.3, 0.07, lor), get_bar(rad, t-0.4, 0.06, lor), get_bar(rad, t-0.5, 0.05, lor), get_bar(rad, t-0.6, 0.04, lor), get_bar(rad, t-0.7, 0.03, lor), get_bar(rad, t-0.8, 0.02, lor), get_bar(rad, t-0.9, 0.01, lor), get_bar(rad, t-1.0, 0.005, lor), get_bar(rad, t-1.1, 0.005, lor), get_bar(rad, t-1.2, 0.005, lor), get_bar(rad, t-1.3, 0.005, lor), ] kmax = len(past_range) for (k,fill_range) in enumerate(past_range): for (x, y) in fill_range: x_int = np.clip(round(N*x + N),0, 2*N) y_int = np.clip(round(N*y + N),0, 2*N) img_np[x_int,y_int] = 1/kmax*k frames.append(img_np) return frames
つくったフレームからgifアニメーションをつくる
frames = get_frames_for_circle(rad=0.75, lor=0.05) % ↓画像としてほしかったらこれをコメントアウトして % plt.imshow(frames[-1]) fig, ax = plt.subplots() img = ax.imshow(frames[0], cmap='gray') def update(frame): img.set_array(frame) return [img] ani = FuncAnimation(fig, update, frames=frames, interval=50) ani.save('animation.gif', writer='imagemagick')
