ヨハウィングの忘備録

レッドブル・インターネットの

パーリンノイズアルゴリズムのお勉強

ふと頭のなかでパーリンノイズ生成の妄想をしていたので、
形にしようかと思う。

パーリンノイズのもととなる考え方はフラクタルである。

やりかたとして、

  • 大きい波を用意
  • 小さい波を掛けあわせていく。

が基本理念となるが、その方法は様々である。

今回アルゴリズムを組んだのは、1次元のパーリンノイズです。

  • ざっくりとした山を作る。
  • 点の間に中点をとり、ランダムで上下させる。


ということで、できたのがこれ。

http://yohawing.com/exp/sketch/04/

簡略化したアルゴリズムはこれ

  • 10個のランダムな点で波を作り、配列に格納
  • 中点を追加して、前後の点を見て上下させる。
  • 前の配列の値の間に中点の値を入れて、配列に格納
  • 繰り返し。
function perlinNoise2d(noise){
        NUM = 10
	noise = [];
	noise[0] = new Array(NUM)
	
	for (var i=0; i<NUM; i++) {
		if(i==0) {
			for (var j=0; j<noise[0].length; j++) {
				noise[0][j] = rand(-height/2, height/2)
			}
		}else{
			//べき乗で波の細かさを増やしています。
			noise[i] = new Array(Math.pow(2,i)*NUM);
			set(noise[i],noise[i-1]);
		}
	}
}
//点の中点を上下させるアルゴリズム。
//正直もうちょいスマートにできたと思う。
function set(arr1, arr2){
	for (var i=0; i<arr1.length; i++) {
		if (i%2 == 1) arr1[i] = (i==arr1.length-1)?
			height/2:
			rand( arr2[(i-1)/2], arr2[(i+1)/2]) 
		else arr1[i] = arr2[i/2];
	}
	return arr1;
}

こういうアルゴリズムを一行で作る人を尊敬したい。