パーリンノイズアルゴリズムのお勉強
ふと頭のなかでパーリンノイズ生成の妄想をしていたので、
形にしようかと思う。
パーリンノイズのもととなる考え方はフラクタルである。
やりかたとして、
- 大きい波を用意
- 小さい波を掛けあわせていく。
が基本理念となるが、その方法は様々である。
今回アルゴリズムを組んだのは、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; }
こういうアルゴリズムを一行で作る人を尊敬したい。