トップページ > アルゴリズム > 中点変位法でハイトマップを生成する



概要

中点変位法で線を描くでは1次元の線を作成しましたが、今回は2次元に拡張してハイトマップを生成してみましょう。


アルゴリズム

ハイトマップをBitmap(Data)で作成するとします。


四隅のピクセルに適当な値を入れておきます。


var midPoint:Number = (tl + tr + bl + br) / 4 + getRandomHeight(size);
 
四隅から見て中央にあるピクセルに、平均値 + 変位させるランダムな値を入れます。


var top:Number = (tl + tr) / 2;		// 上 = 左上と右上の平均値
var bottom:Number = (bl + br) / 2;	// 下 = 左下と右下の平均値
var left:Number = (tl + bl) / 2;	// 左 = 左上と左下の平均値
var right:Number = (tr + br) / 2;	// 右 = 右上と右下の平均値
 
四隅の間のピクセル(中央の上下左右)に各平均値を入れます。


size /= 2;
generateHeightmap(x, y, size, tl, top, left, midPoint);
generateHeightmap(x + size, y, size, top, tr, midPoint, right);
generateHeightmap(x, y + size, size, left, midPoint, bl, bottom);
generateHeightmap(x + size, y + size, size, midPoint, right, bottom, br);
 
後は矩形を4分割(2*2)して再帰的に値を求めていきます。


public function getRandomHeight(value:Number):Number
{
	// -0.5~0.5 -> -0.25~0.25 -> -0.125~0.125
	return (Math.random() - 0.5) * value / size; 
}
 
一次元の場合と同じように、変位させる値の範囲は分割するたび(サイズが小さくなるたび)に小さくさせます。


プログラム

コメント有り
+ ...

コメント無し
+ ...


実行結果

flash on 2011-10-2 - wonderfl build flash online

画面をクリックするたびにハイトマップを生成します。

|新しいページ|検索|ページ一覧|RSS|@ウィキご利用ガイド | 管理者にお問合せ
|ログイン|
添付ファイル