PHPで樹木曲線を描く

(1/1)
PHPで樹木曲線を描くプログラムを作る。
樹木曲線はフラクタル図形の一種で、再帰呼び出しを使うと簡単に描くことができる。

サンプル・プログラム

ダウンロードしたスクリプトを実行するには GDライブラリが必要である。

download プログラムを実行する

download ダウンロード

なお、コマンドラインから枝の数(order;1以上12以下の整数)と描画領域の1辺の長さ(length;10以上500以下の整数)を指定できるようにしてある。たとえば、枝の数が9で、描画領域の1辺を400(ドット)としたければ

TreeCurve?order=9&length=400


のように指定する。

樹木曲線とは

樹木曲線フラクタル図形の一種である。
フラクタル図形とは、その図形を拡大していくと、ある部分に元の図形と同じパターンが現れるものである。海岸線や雪の結晶など、自然界でよく見られる。

樹木曲線は左図のような図形である。枝の部分を切り出して拡大すると、元の枝と同じパターンになっていることが分かる。

サンプル・プログラムの解説:樹木曲線

0051: /**
0052:  * 樹木曲線メインプログラム
0053:  * @param int $n再帰の深さ
0054:  * @param double $len枝の長さ
0055:  * @param double $angle枝の傾き(ラジアン)
0056:  * @return -
0057: */
0058: function tree($n$len$angle) {
0059:     static $fac  = 0.7;
0060:     static $turn = 0.5;
0061: 
0062:     $dx = $len * sin($angle);
0063:     $dy = $len * cos($angle);
0064:     movePen($dx$dyTRUE);
0065:     if ($n > 0) {
0066:         tree($n - 1, $len * $fac$angle + $turn);
0067:         tree($n - 1, $len * $fac$angle - $turn);
0068:     }
0069:     movePen(0 - $dx, 0 - $dyFALSE);
0070: }

樹木曲線を描く部分はシンプルである。
ユーザー関数 tree再帰呼び出ししている。

解説:プロッタ・エミュレータ

0018: /**
0019:  * 線分を描画する(プロッタのエミュレータ)
0020:  * @param resource $img  イメージストリーム
0021:  * @param double ($x1, $y1) - ($x1, $y2)  線分の座標
0022:  * @return -
0023: */
0024: function my_imageline($img$x1$y1$x2$y2) {
0025:     global $CanvasLength$PenColor;
0026: 
0027:     $dh = $CanvasLength * 0.25;
0028:     $x1 = $CanvasLength * 1.5 - round($x1 * $dh);
0029:     $y1 = $CanvasLength * 1.0 - round($y1 * $dh);
0030:     $x2 = $CanvasLength * 1.5 - round($x2 * $dh);
0031:     $y2 = $CanvasLength * 1.0 - round($y2 * $dh);
0032: 
0033:     imageline($img$x1$y1$x2$y2$PenColor);
0034: }
0035: 
0036: /**
0037:  * ペンを移動する(プロッタのエミュレータ)
0038:  * @param double $dx, $dyペンの移動量
0039:  * @param bool $draw TRUE=ペンを落として移動/FALSE=ペンを上げて移動
0040:  * @return -
0041: */
0042: function movePen($dx$dy$draw) {
0043:     global $Canvas;
0044:     static $x$y;
0045: 
0046:     if ($draw == TRUE)  my_imageline($Canvas$x$y$x + $dx$y + $dy);
0047:     $x += $dx;
0048:     $y += $dy;
0049: }

再帰呼び出しを用いて図形を描く場合、現在の位置から横方向(X方向)へ幾ら、縦方向(Y方向)へ幾ら進むといった相対座標指定を使うことが多い。プロッタではこのような制御を行うことが多い。
そこで今回は、プロッタのように相対座標で線分を描くためのユーザー関数 movePen を用意した。

参考サイト

(この項おわり)
header