Ich implementiere verbessertes Perlin-Rauschen . Das Hauptmerkmal für die Randomisierung ist die fest codierte Permutationstabelle, die im Wesentlichen zufällige, aber reproduzierbare Gradienten an den Zellen des Gitters liefert. Die Permutationstabelle ist nur eine Permutation der ganzen Zahlen 0..255
und normalerweise die folgende Tabelle (direkt aus Perlins ursprünglicher Implementierung kopiert):
{151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7,
225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247,
120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33,
88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134,
139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220,
105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80,
73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86,
164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38,
147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189,
28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101,
155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232,
178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12,
191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181,
199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236,
205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180};
Als Referenz sieht ein kleiner Fleck aus dem von dieser Tabelle erzeugten Rauschen folgendermaßen aus:
Ich möchte jedoch, dass der Code etwas flexibler ist und dass diese Tabelle neu gemischt wird, damit ich ein völlig neues Rauschfeld erstellen kann (anstatt es nur mit einem anderen Versatz abzutasten). Aber nicht alle Permutationen werden gleich gut gemischt. In dem unwahrscheinlichen Fall, dass die zufällige Permutation nur das sortierte Array von 0
bis ist 255
, würde das Rauschen stattdessen so aussehen:
Das ist irgendwie schlecht. Natürlich mit einer Chance von zuDies ist kein Fall, über den ich mir Sorgen machen muss. Dies ist jedoch sicherlich nicht die einzige Permutation, die sehr auffällige Artefakte liefert. Umgekehrt sortierte und fast sortierte Permutationen hätten wahrscheinlich die gleichen Probleme. Wie viele andere Permutationen sind also ungeeignet? Angenommen, der Code würde in einem beliebten Spiel verwendet, um eine zufällige Welt im Voraus zu generieren. Es wäre immer noch ärgerlich, wenn jede 100.000ste generierte Welt aus der Ferne regelmäßig aussehen würde.
Die Frage ist also, was genau eine gute (oder eine schlechte) Permutationstabelle ausmacht und wie ich die Qualität einer Permutationstabelle programmgesteuert einschätze, damit ich die Tabelle in dem unwahrscheinlichen Fall, dass ich eine "schlechte" würfle, erneut neu mischen kann " Tabelle?