任意の数のパーリン ノイズ マップとそれぞれの重みを取得しました。すべての重みの合計は 1 ですが、違いはありません。
重みに関して最高値でそのノイズを取得したい。
私の最初のアプローチは、各パーリン ノイズから数値を取得し、これらをパーセンテージに変換し (そのためのループアップ テーブルがあります)、重みを掛けて、最も高い値を選択することでした。しかし、このアプローチには大きな欠点があります。小さな重みを識別し、大きな重みを優先するため、分布が台無しになります。20% に 0.2 の重みが表示されるようにします。
これをマップ ジェネレーターでタイル タイプを選択するために使用したいと考えています。複数のパーリン ノイズを使用します。これは、多くの異なるタイル タイプを使用して互いに境界線を引きたいため、グラデーションを使用できないためです。
この欠陥を修正する方法、またはタイルベースのマップを生成する別の方法を知っている人はいますか?
編集:その間、私はほぼ受け入れられる解決策を見つけました:
final float[] values = new float[noises.length];
for (int i = 0; i < values.length; i++)
values[i] = noises[i].get(x, y) * (1f + (weights[i] - 1f / noises.length));
int max = 0;
for (int i = 1; i < values.length; i++)
if (values[i] > values[max])
max = i;
return noises[max];
唯一の欠点は不正確であることです。重みが 0f の場合でも、約 6% の時間でノイズが返されます。