私が考え出した解決策: まず、1 億個のパーリン ノイズを生成し、それらを配列に格納します。それを並べ替えた後、10,000 ごとの値を 1000 分の 1 のしきい値として使用できます。これで、これらのしきい値をハードコードできるようになったので、実行時にルックアップするための 1,000 個の浮動小数点数を持つ配列ができました。
利点:
実行時の配列へのアクセスは 1 回だけなので、非常に高速です。
欠点:
アルゴリズムを変更した場合は、しきい値配列を再生成する必要があります。次に、平均は約 10/10 にスケーリングされ、50% のしきい値は 49.5% または 50.5% になります (< または <= 演算子を使用するかどうかによって異なります)。第 3 に、メモリ フットプリントの増加 (1 ミルあたりの精度で 4kb)。パーセント精度または対数精度スケールを使用して、これを減らすことができます。
生成コード:
final PerlinNoiseGenerator perlin = new PerlinNoiseGenerator(new Random().nextInt());
final int size = 10000; //Size gets sqared, so it's actually 100,000,000
final float[] values = new float[size * size];
for (int x = 0; x < size; x++)
for (int y = 0; y < size; y++) {
final float value = perlin.noise2(x / 10f, y / 10f);
values[x * size + y] = value;
}
System.out.println("Calculated");
Arrays.sort(values);
System.out.println("Sorted");
final float[] steps = new float[1000];
steps[999] = 1;
for (int i = 0; i < 999; i++)
steps[i] = values[size * size / 1000 * (i + 1)];
System.out.println("Calculated steps");
for (int i = 0; i < 10; i++) {
System.out.println();
for (int j = 0; j < 100; j++)
System.out.print(steps[i * 100 + j] + "f, "); //Output usuable for array initialization
System.out.println();
System.out.println();
}
参照コード:
public final static float[] perlinThresholds = new float[]{}; //Initialize it with the generated thresholds.
public static float getThreshold(float percent) {
return perlinThresholds[(int)(percent * 1000)];
}
public static float getThreshold(int promill) {
return perlinThresholds[promill];
}
X