目次
Pythonの再帰処理を使って描く「C曲線」と「樹形図」
今回は、図形「C曲線」と「樹木曲線」をPythonで実装します。
matplotlibのグラフの機能を利用して描画しています。
再帰処理を使います。
再帰処理とは、関数の中で自分自身を呼び出すようなやり方のことです。
C曲線
C曲線とは、このような図形です。
なんとなく可愛くて、僕はこの図形が結構好きです。
これを描くソースコードはこちらです。
class_graphics.py
from matplotlib import pyplot as plt class Ccurve(): def __init__(self): self.__tx = [1.0] self.__ty = [2.0] self.__title = "C曲線を描く" def __move(self, lpx, lpy, dx, dy): self.__tx.append(lpx + dx) self.__ty.append(lpy + dy) def __draw(self, st_len=10.0, lpx=0.0, lpy=0.0, dx=2.0, dy=0.0): leng = st_len if(leng <= 0.0): self.__move(lpx, lpy, dx, dy) else: self.__draw(leng - 1.0, self.__tx[-1], self.__ty[-1], (dx + dy) / 2, (dy - dx) / 2) self.__draw(leng - 1.0, self.__tx[-1], self.__ty[-1], (dx - dy) / 2, (dy + dx) / 2) return self.__tx, self.__ty def draw(self): x, y = self.__draw() plt.plot(x, y) plt.title(self.__title) plt.show()
再帰処理です。
__draw()の中でパラメータを少しずつ小さくしながら、__draw()自身を再帰的に呼び出しています。
使うときは。
from class_graphics import Ccurve Ccurve().draw()
とすると、上記の図形を表示します。
樹形図(樹木曲線)
ブロッコリーみたいだと自分は思ってますが・・樹形図です。
描いた図形はこんな感じです。
これを描くソースコードです。
Numpyが必要なので、importを追加しています。
同じファイルにクラスを追記しています。
class_graphics.py
import matplotlib.pyplot as plt import numpy as np class TreeCurve(): def __init__(self): self.__tx = [320.0] self.__ty = [380.0] self.__title = "樹形図(樹木曲線)を描く" def __move(self, leng, lpx, lpy, angle): x = lpx + leng * np.cos(angle * np.pi / 180.0) y = lpy + leng * np.sin(angle * np.pi / 180.0) self.__tx.append(x) self.__ty.append(y) return x, y def __draw(self, leng=120.0, lpx=320.0, lpy=380.0, angle=90.0, scale=0.7): if(leng >= 5.0): self.__tx.append(lpx) self.__ty.append(lpy) lpx, lpy = self.__move(leng, lpx, lpy, angle) self.__draw(leng * scale, lpx, lpy, angle + 20.0) self.__draw(leng * scale, lpx, lpy, angle - 20.0) return self.__tx, self.__ty def draw(self): x, y = self.__draw() plt.plot(x, y) plt.title(self.__title) plt.show()
これも再帰処理しています。
__drawe()のパラメータを変化させながら、20度ずつ角度を変えて__draw()自身を再帰呼出ししています。
ポイントは、__draw()の中で、一度原点に戻ってから、ラインを引く位置に移動(__move())していることで、この動きによって、樹形図っぽい図形になります。
使うときは。
from class_graphics import TreeCurve TreeCurve().draw()
です。
ちなみに。
move()の中の以下の部分
y = lpy + leng * np.sin(angle * np.pi / 180.0)
これを、以下のように「-」に変更すると
y = lpy - leng * np.sin(angle * np.pi / 180.0)
上下逆転した図形になります。
ではでは。