d3r4-2.py

プログラム一覧に戻る

import numpy as np  # データ読み込み機能などを使えるようにする
from PIL import Image, ImageDraw, ImageFont  # 画像の作成機能を使えるようにする
import sys

WIDTH = HEIGHT = 500  # アニメーション画像の幅と高さ
SCALE = 16  # 描画サイズに合わせるための拡大率
x_g = WIDTH // 3  # 描画サイズに合わせるための原点ずらしの大きさ
y_g = HEIGHT // 2  # 描画サイズに合わせるための原点ずらしの大きさ

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

data = np.loadtxt("d3r4.txt")  # データファイルの読み込み
t = data[:, 0]  # 0列目を t という配列に格納
x1 = SCALE * data[:, 1] + x_g  # 1列目を x1 という配列に格納(描画サイズに合わせる変換込み)
x2 = SCALE * data[:, 2] + x_g  # 2列目を x2 という配列に格納(描画サイズに合わせる変換込み)
y1 = SCALE * data[:, 3] + y_g  # 3列目を y1 という配列に格納(描画サイズに合わせる変換込み)
y2 = SCALE * data[:, 4] + y_g  # 4列目を y2 という配列に格納(描画サイズに合わせる変換込み)

R = SCALE  # 粒子の半径(数値計算では半径1だったのを描画サイズに合わせる)

# 画像を1枚ずつをここに入れていく(最初はカラ)
images = []

# ループを用いてパラパラ漫画を作る
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)
    draw.ellipse((x1[k] - R, y1[k] - R, x1[k] + R, y1[k] + R), fill=(0, 205, 0), outline=(0, 0, 0))
    draw.ellipse((x2[k] - R, y2[k] - R, x2[k] + R, y2[k] + R), fill=(0, 0, 205), outline=(0, 0, 0))
    images.append(img)

# パラパラ漫画をつないでアニメーションgifを作る
images[0].save("d3r4-2.gif", save_all=True, append_images=images, optimize=True, duration=50, loop=1)