"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

Pythonでグラフィックス:「うずまき風図形」を描く処理を実装してみました。

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

これも元ネタは、C言語のプログラムで絶版の「TurboC グラフィックス入門」という本で紹介されていたものです。

それをPythonで書き直したものです。

 

まずは仕様から

 

パラメータは3つです。

 

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

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

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

 

ソースコードです

 

ソースコード全文です。

gr_plt_spin.py

import matplotlib.pyplot as plt
import numpy as np


def draw_spin(st_len=200.0,angle=89.0, step=1.0):
    tx = [0]
    ty = [0]
    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)
        tx.append(x)
        ty.append(y)
        lpx = x
        lpy = y
        ang = ang + angle
        ang = ang - ang + ang % 360.0
        leng = leng - step
    return tx, ty


x, y = draw_spin()
plt.plot(x, y)
plt.title('うずまき関数')
plt.show()

補足します。 

これは「タートルグラフィック」という手法です。

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

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

だから上記のソースの「draw_spin()」も。

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

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

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

lpx = x
lpy = y

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

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

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

 leng = leng - step

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

こんな単純なことの繰り返しなのに、実行するとこんな図形が描けます。

f:id:arakan_no_boku:20181201004248j:plain

すごいですねえ。

 

例によって、パラメータを変更して遊んでみます

 

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

x, y = draw_spin(st_len=600.0)

すると。

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

f:id:arakan_no_boku:20181201004917j:plain

今度は、一度に回転する角度を増やしてみます。

120度くらいにしてみましょうか。

x, y = draw_spin(angle=120.0)

すると。

なんと三角形になってしまいます。

f:id:arakan_no_boku:20181201005209j:plain

じゃあ。

半分くらいに減らしてみます。

x, y = draw_spin(angle=44.5)

すると。

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

gr_plt_spin_2.py

f:id:arakan_no_boku:20181201005457j:plain

面白いですね。

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

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

面白いですねえ。

これも、時間つぶしのおもちゃにもってこいです。

ではでは。