プログラム一覧に戻る
import numpy as np # データ読み込み機能などを使えるようにする
from PIL import Image, ImageDraw, ImageFont # 画像の作成機能を使えるようにする
import sys
WIDTH = HEIGHT = 500 # アニメーション画像の幅と高さ
SCALE = 16 # 描画サイズに合わせるための拡大率
x_g = WIDTH // 3 # 描画サイズに合わせるための原点ずらしの大きさ
y_g = HEIGHT // 3 # 描画サイズに合わせるための原点ずらしの大きさ
BACKGROUND_COLOR = (255, 255, 255) # 画像の背景色を白色に設定
# フォントの設定
if sys.platform == "win32":
font = ImageFont.truetype("arial.ttf", 24)
elif sys.platform == "darwin":
font = ImageFont.truetype("Arial.ttf", 24)
else:
font = None
N = 4 # 粒子数
data = np.loadtxt("d4r1.txt") # データファイルの読み込み
t = data[:, 0] # 0列目を t という配列に格納
x = SCALE * data[:, 1 : N + 1] + x_g # 各粒子のx座標を格納
y = SCALE * data[:, N + 1 : 2 * N + 1] + y_g # 各粒子のy座標を格納
R = SCALE # 粒子の半径(数値計算では半径1だったのを描画サイズに合わせる)
images = [] # 画像を1枚ずつをここに入れていく(最初はカラ)
# ループを用いてパラパラ漫画を作る
for k in range(t.size):
img = Image.new("RGB", (WIDTH, HEIGHT), BACKGROUND_COLOR)
draw = ImageDraw.Draw(img)
draw.text((3 * WIDTH // 5, 4 * HEIGHT // 5), f"time is {t[k]:5.1f}", fill=(0, 0, 0), font=font)
for i in range(N):
draw.ellipse((x[k, i] - R, y[k, i] - R, x[k, i] + R, y[k, i] + R), fill=(0, 205, 0))
images.append(img)
# パラパラ漫画をつないでアニメーションgifを作る
images[0].save("d4r1-2.gif", save_all=True, append_images=images, optimize=True, duration=45, loop=1)