はじめに
「木」というのは、プログラマにとって、少なくとも「データ構造」としてはなじみ深いものです。
木構造を構成する要素は以下の4つです:
- 節点(node)
- 枝(branch)
- 葉(leaf)
- 根(root)
このうち、葉と根は節点の特殊なものです。
この「データ構造としての木」を扱う処理は、今回の「図形としての木」の処理と同様の「再帰呼び出し」となっています。
プログラムで木を描く
フラクタル図形としての木(ここでは二分木)を描くには、タートルグラフィクスで以下のようにします。
#include <stdio.h>
#include <math.h>
void pd();
void pu();
void rt(float th);
void lt(float th);
void fd(float len);
void bk(float len);
void tree(float len, float rr, float lr, float th, int n) {
if(n > 0) {
fd(len);
lt(th);
tree(len*lr, rr, lr, th, n-1);
rt(th*2.0);
tree(len*rr, rr, lr, th, n-1);
lt(th);
bk(len);
}
}
int main()
{
pd();
tree(10.0, 0.7, 0.7, 30.0, 10);
}
※タートルグラフィクスについては別記事(フラクタル図形を描く(道具編)参照の事。
木の形を制御できるように以下の引数(len,lr,rr,th,n)をパラメータとしています:
パラメータ | 意味 |
---|---|
len | 枝の基本長さ |
lr | 左の枝の縮み率 |
rr | 右の枝の縮み率 |
th | 枝の開き角度 |
n | 再帰呼び出しの深さ |
以下、パラメータを変化させたものです。
パラメータ | 結果 |
---|---|
(10.0, 0.7, 0.7, 30.0 ) | |
(10.0, 0.7, 0.7, 10.0 ) | |
(10.0, 0.7, 0.7, 45.0 ) | |
(10.0, 0.5, 0.8, 30.0 ) |
|
発展
ここまで、二分木の描画のためのコードと例を紹介しましたが、パラメータや描画の構造に手を加える事で、されに複雑で本物らしい木を描く事も可能です。例えば以下のようなバリエーションがあると思います:
- 枝の分岐を二本以上にする
- 枝の縮み率に乱数を含める
- 枝の太さをパラメータに入れる
- 末端で葉(leaf)を描く
等々、いろいろと試してみると面白いと思います。
今回は以上です。