私は"Midpoint displacement algorithm example"からコードを取り出し、それを少しきれいにして、それを1Dの線形テレインジェネレータとして動作させるために再試行しました。この中点変位アルゴリズムの「粗さ定数」とは何ですか?どのように修正できますか?
がpublic boolean setMidpointDisplacement(int x1, int x2) {
// Exit recursion if points are next to eachother
if (x2 - x1 < 2) {
return false;
}
final int midX = (x1 + x2)/2;
final int dist = x2 - x1;
final int distHalf = dist/2;
final int y1 = map[x1];
final int y2 = map[x2];
final int delta = random.nextInt(dist) - distHalf; // +/- half the distance
final int sum = y1 + y2;
map[midX] = (sum + delta)/2; // Sets the midpoint
// Divide and repeat
setMidpointDisplacement(x1, midX);
setMidpointDisplacement(midX, x2);
return true;
}
コードがうまく動作しているようですし、実行可能な地形を生成
(あなたが基本的なGUIで、how I've tested itを見ることができる)、"Generating Random Fractal Terrain"と"Mid Point Displacement Algorithm"を読んだ後、私の質問:下記のdoMidpoint()
方法の私の新しいバージョンがあります:
このコードで暗黙的に使用されている「粗さ定数」をどのように特定できますか?それから、どうすれば変更できますか?
さらに、これは私の主要な質問に直接関係するかもしれませんが、私はコードがy値の合計を "デルタ"(変化量)に加え、これを2で割ることに気付きました - これは合計を平均化し、デルタ/ 2を加算するのと同じですが。これは「粗さ定数」に何らかの影響を与えますか?私は
map[midX] = sum/2 + delta/K;
を行うことができ、Kは今「粗定数」の代表だろうと考えていますが、これは正確であるかどうかは私には平滑化を制御できるように思えるので、私は、よく分かりません「ランダムフラクタル地形を生成する」で定義されているように、「ループを通過するたびに乱数範囲がどのくらい減少するか」を直接制御することはありません。
私が以前に言ったように、私が見つけた2D MDPノイズジェネレータを1Dバージョンに移植しました。しかし、私はそれを正確に行っていることを確信しています。
偉大な答え。しかしこの時点では、 'delta'に(0,1)の二倍の範囲を掛けるだけではないのですか?私は' factor 'を1/2、1/4、1/8など –
@KartikChughヅ「デルタに(0,1)の二倍の範囲を掛け合わせるだけの違いがあれば?」と言いました。 '(用語では)カーブ/サーフェスの**滑らかさ**が実際に増加し、私はその用語を誤った名前と呼ぶだろう。私は1に近い乗算係数の高い値を想像しています(そしてなぜ1に制限するのか?)、かなりギザギザの地形になります。 –