PHPで雪の結晶を描く

(1/1)
PHPで雪の結晶を描く
PHPで樹木曲線を描く」の応用で、雪の結晶(のようなもの)を描いてみることにする。

樹木曲線の枝を3本に増やし、中心から角度を変えて複数生やしてやることで、雪の結晶のような図形ができあがる。

(2022年4月17日)PHP8対応,リファラ・チェック改良。

目次

サンプル・プログラム

圧縮ファイルの内容
CrystalSnow.phpサンプル・プログラム本体

解説:再帰図形

主要処理はクラス pahooCrystalSnow として定義している。

再帰図形の描き方は、「PHPで樹木曲線を描く」とほぼ同じである。

ユーザー関数 CrystalSnow では、中心から結晶の角の数(デフォルトでは正六角形)だけ回転させ、tree3 を呼び出す。

tree3 は再帰呼び出しによる樹木曲線で、枝を2本から3本に増やしている。

解説:太さのある直線

結晶の中心に行くほど太さがある直線になるよう、ユーザー関数 imagelinethick を用意した。

解説:各種パラメータ

 323: /**
 324:  * $_GET または $_POST から正規化した数値を取り出す
 325:  * @param   string $type int:整数 float:浮動小数
 326:  * @param   string $key キー
 327:  * @param   mixed $min, $max 最小値、最大値
 328:  * @param   string $errmsg エラーメッセージを格納する
 329:  * @return  mixed 取得値/NULL:エラー
 330: */
 331: function getParameters(&$items) {
 332:     static $tbl_val = array(
 333:         //描画領域(正方形)の1辺の長さ(ピクセル)
 334:         'width'=>array('type'=>'float', 'min'=>100, 'max' => 1000, 'def'=>500),
 335:         //再帰回数
 336:         'recur'=>array('type'=>'int', 'min'=>1, 'max'=>8, 'def'=>6),
 337:         //結晶の角の数(何角形か)
 338:         'corner'=>array('type'=>'int', 'min'=>3, 'max'=>12, 'def'=>6),
 339:         //枝の発生位置(比率)
 340:         'fac'=>array('type'=>'float', 'min'=>0.2, 'max'=>0.8, 'def'=>0.55)
 341:     );
 342:     static $tbl_str = array(
 343:         //背景色
 344:         'bgcolor'=>array('pat'=>'/^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i', 'def'=>'000000'),
 345:         //描画色
 346:         'color'=>array('pat'=>'/^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i', 'def'=>'CCCCFF')
 347:     );
 348:     foreach ($tbl_val as $key=>$arr) {
 349:         $items[$key] = getValidNumber($key, $arr['type'], $arr['min'], $arr['max'], $arr['def']);
 350:     }
 351:     foreach ($tbl_str as $key=>$arr) {
 352:         $items[$key] = '#' . getValidString($key, $arr['pat'], $arr['def']);
 353:     }
 354: }

コメントに記したように、描画領域の大きさ、再帰回数、結晶の角の数など、パラメータとして指定できるようにしてある。

参考サイト

(この項おわり)
header