"BOKU"のITな日常

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

Pythonでグラフィックス:再帰図形2つ「C曲線」と「樹木曲線」を実装してみました

今回は、Pythonで2種類の再帰図形「C曲線」と「樹木曲線」を実装します。

最近「Pythonでグラフィックス」のタイトルで、プログラムで図形を描くネタを続けてましたが、他に面白そうなネタがでてきたので、今回が最後です。

 

まずはC曲線です

 

C曲線って、一般的ではないので知らない人も多いと思います。

こんな図形です。

f:id:arakan_no_boku:20181206232853j:plain

なんとなく可愛くて。

自分はこの図形が結構好きです。

これを描くソースコードはこちらです。

gr_plt_ccurve.py

import matplotlib.pyplot as plt
import numpy as np

tx = [1.0]
ty = [2.0]

def move(lpx,lpy,dx,dy):
    tx.append(lpx + dx)
    ty.append(lpy + dy)
    
def draw_c(st_len=10.0,lpx=0.0,lpy=0.0,dx=2.0, dy=0.0):
    leng = st_len
    if(leng <= 0.0):
        move(lpx,lpy,dx,dy)
    else:
        draw_c(leng -1.0,tx[-1],ty[-1],(dx + dy) /2,(dy - dx)/2)
        draw_c(leng -1.0,tx[-1],ty[-1],(dx - dy) /2,(dy + dx)/2)
    return tx, ty

x, y = draw_c()
plt.plot(x, y)
plt.title('C曲線')
plt.show()

典型的な再帰図形です。

draw_c()のパラメータを少しずつ小さくしながら、再帰的に呼び出しているだけ。

ごく短くて、ほとんど補足説明もいらない位のシンプルなコードです。

昔にC言語で作っていたコードをPythonで書き直しました。

元は、確か「奥村晴彦氏のアルゴリズム事典」だったと思います。

もう、20年以上昔に買った本ですけどね。

 

今度は樹木曲線です

 

樹木曲線・・というより、ブロッコリーみたいだと自分は思ってますが。

こんな感じです。

f:id:arakan_no_boku:20181206235009j:plain

これを描くソースコードはこんなです。

gr_plt_tree2.py

import matplotlib.pyplot as plt
import numpy as np

tx = []
ty = []

def move(leng, lpx, lpy, angle):
    x = lpx + leng * np.cos(angle * np.pi / 180.0)
    y = lpy + leng * np.sin(angle * np.pi / 180.0)
    tx.append(x)
    ty.append(y)
    return x, y

    
def draw_tree(leng=120.0, lpx=320.0, lpy=380.0, angle=90.0,scale=0.7):
    if(leng >= 5.0):
        tx.append(lpx)
        ty.append(lpy)
        lpx,lpy = move(leng,lpx,lpy,angle)
        draw_tree(leng*scale,lpx,lpy,angle+20.0)
        draw_tree(leng*scale,lpx,lpy,angle-20.0)
    return tx, ty

def init(lpx=320.0,lpy=380.0):
    tx.append(lpx)
    ty.append(lpy)
    
init()
x, y = draw_tree()
plt.plot(x, y)
plt.title('樹木曲線')
plt.show()

これも典型的な再帰図形です。

draw_tree()を小さくしつつ、20度ずつ角度を変えながら再帰呼出ししています。 

ポイントは、draw_tree()の中で。

tx.append(lpx)
ty.append(lpy)

とやって、一度原点に戻ってから、ラインを引く位置に移動(move())していること。

この動きによって、樹形図っぽい図形になるわけですね。

これも、昔にC言語で書いていたコードをPythonで書き直しました。

参考にしたのは、1992年頃(古いなあ)の「Turbo C グラフィックス入門」という本だったと思います。

ちなみに。

move()の中の以下の部分

y = lpy + leng * np.sin(angle * np.pi / 180.0)

これを、以下のように「-」に変更すると

y = lpy - leng * np.sin(angle * np.pi / 180.0)

上下逆転した図形になります。

gr_plt_tree.py

f:id:arakan_no_boku:20181207000134j:plain

うーん。

ますます、ブロッコリーですね(笑)

 

最後に、グラフィックスシリーズの記事をまとめときます

 

リンクをまとめておきます。

arakan-pgm-ai.hatenablog.com

arakan-pgm-ai.hatenablog.com

arakan-pgm-ai.hatenablog.com

arakan-pgm-ai.hatenablog.com

arakan-pgm-ai.hatenablog.com 

気づくと結構書いてます。

でも。

こうやって、C言語のプログラムをPythonで書き直してみると、Pythonという言語がどれくらい強力で、かつ、シンプルにロジックが記述できるかを思い知りました。

ではでは。