"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

Pythonでグラフィックス:うずまき風の図形を描くクラス

f:id:arakan_no_boku:20210912183619p:plain

目次

うずまき風の図形

今回は、Pythonで「うずまき風図形」を描く処理を実装してみます。

デフォルトで描くとこんな感じ

f:id:arakan_no_boku:20210918225714p:plain

描画クラスのソースコード

ソースコード全文です。

グラフの描画機能を使います。

matplotlibとNumpyが必要です。

タイトルを日本語にしているので、文字化けしないためには、matplotlibは日本語フォントが設定されている必要があります。

arakan-pgm-ai.hatenablog.com

class_graphics.py

import matplotlib.pyplot as plt
import numpy as np


class VortexCurve():

    def __init__(self):
        self.__tx = [0]
        self.__ty = [0]
        self.__title = "うずまき風カーブを描く"

    def __draw(self, st_len, angle, step):
        ang = 0.0
        lpx = 0.0
        lpy = 0.0
        leng = st_len
        x = 0.0
        y = 0.0
        while(leng > 10.0):
            x = lpx + leng * np.cos(ang * np.pi / 180.0)
            y = lpy - leng * np.sin(ang * np.pi / 180.0)
            self.__tx.append(x)
            self.__ty.append(y)
            lpx = x
            lpy = y
            ang = ang + angle
            ang = ang - ang + ang % 360.0
            leng = leng - step
        return self.__tx, self.__ty

    def draw(self, st_len=200.0, angle=89.0, step=1.0):
        x, y = self.__draw(st_len, angle, step)
        plt.plot(x, y)
        plt.title(self.__title)
        plt.show()
ソーコードの補足説明

タートルグラフィックスという手法です。

亀が歩いていって、到達した場所に点をうち、そこをスタート地点にして、くるっと方向を変えて、また歩いて行って到達した場所に点をうつ。

そんな単純な動きの繰り返しで、図形描くイメージです。

だから上記のソースも。

① スタート地点又は歩いて到達した場所の座標(x,y)を求めて点をうつ

x = lpx + leng * np.cos(ang * np.pi / 180.0)
y = lpy - leng * np.sin(ang * np.pi / 180.0)
self.__tx.append(x)
self.__ty.append(y)

  ② そこをスタート地点にする

lpx = x
lpy = y

 ③ 指定した角度(angle)分くるっと回る

ang = ang + angle
ang = ang - ang + ang % 360.0

④ 直線を「step」分短くする

 leng = leng - step

と読めば、なんとなくやってることはわかります。

実行してみます

パラメータは3つあります。

st_len 開始時の長さです。
angle 1回に回転する角度です。
step 一回に減らす直線の長さです。

この処理は、指定した「st_len」の長さの直線を、一回につき、「step」分だけ短くしながら、一回につき「angle」分回転することで渦巻を描きます。

そして、直線の長さが10.0より短くなった描き終わりになります。

なのでパラメータを変更していくと、形がかわります。

まずは、デフォルト設定のままで実行します。

ソースはこんな感じ。

from class_graphics import VortexCurve

VortexCurve().draw()

f:id:arakan_no_boku:20210918225714p:plain

ここから、パラメータを変更していきます。

最初の直線の長さを3倍の「600.0」にしてみます。

VortexCurve().draw(st_len=600.0)

すると。

回転する回数が増えますから、台風みたいな濃密な渦になります。

f:id:arakan_no_boku:20210918230812p:plain

今度は、一度に回転する角度を変えてみます。

VortexCurve().draw(angle=44.5)

すると。

渦巻の形が 八角形ぽくなりました。

f:id:arakan_no_boku:20210918230954p:plain

他にも、いろいろ数字を変えていくと、予想もしないような図形が急に現れてきます。

単純な動きの反復なのに、予想がなかなか当たらない。

面白いです。

ではでは。