"BOKU"のITな日常

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

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

f:id:arakan_no_boku:20210912183619p:plain

目次

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

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

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

亀が歩いていって、到達した場所に点をうち、そこで方向を変えて、また歩いて行って到達した場所に点をうつ。

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

 

描画プログラムのソースコード

ソースコード全文です。

matplotlibのグラフ機能を使って、グラフィックを描きます。

計算にはNumpyも使っています。

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

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

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

面白いです。

ではでは。