Der Diamantquadrat-Algorithmus ist ein Algorithmus zur Erzeugung von fraktalem Terrain (Heightmap). Eine schöne Beschreibung, wie es funktioniert, finden Sie hier:
http://www.gameprogrammer.com/fractal.html (Wird als Referenz verwendet.)
http://www.playfuljs.com/realistic-terrain-in-130-lines/ (Großartige JS-Implementierung, vielleicht möchten Sie seinen Renderer stehlen. Schauen Sie sich hier an, was dieser Algorithmus für http: // Demos kann. playfuljs.com/terrain/ .)
Die allgemeine Idee ist, dass Sie 4 Ecken als Startwerte haben (a) und die Höhe des Mittelpunkts berechnen, indem Sie diese vier Ecken mitteln und einen zufälligen Wert hinzufügen, z. B. zwischen -0,5 und 0,5 (b). Wenn Sie dies auf das Raster anwenden, erhalten Sie erneut ein Raster aus Diamanten (Quadrate um 45 ° gedreht) und wiederholen dasselbe (c, d), aber der zufällige Bereich wird kleiner, z. B. -0,125 bis 0,125 usw.
Ihr Programm muss eine Reihe von Eingaben akzeptieren:
- Eine Ganzzahl
l=1,2,3,...
, die die Größe des quadratischen Rasters mit der Seitenlänge bestimmt2^l+1
. Beil=10
Ihnen müssen etwa eine Million Nummern gespeichert werden. - Vier Samen (Fließkomma) für jede Ecke
- Ein Parameter
0<h<1
, der die Rauheit (H
im Link) bestimmt, die angibt , wie groß der zufällige Bereich anfangs ist - Parameter
a,b
, die anfängliche Unter- und Obergrenzen für den Zufallsbereich darstellen undh
bei jedem Verfeinerungsschritt mit multipliziert werden . (Die Zufallszahl wird einheitlich zwischena
und gewähltb
.
Die Ausgabe muss aus dem fertigen 2D-Raster bestehen.
Der grobe Algorithmus würde also so aussehen:
Create a square grid with sidelength 2^l+1
Place seed values in the corners
Repeat:
| Perform square steps
| Refine Range: a = a*h; b=b*h;
| Perform diamond steps
| Refine Range
Es gibt ein Detail, das Sie beachten sollten: An der Grenze des Rasters haben Sie nur drei Scheitelpunkte des Diamanten , daher sollten Sie auch nur den Durchschnitt dieser drei Punkte berechnen.
Eine Visualisierung einiger Beispiele (bitte geben Sie uns an, welche Parameter Sie verwendet haben) ist optional, wird jedoch geschätzt und trägt natürlich nicht zur Byte-Anzahl bei.
Eine leicht abgewandelte Implementierung dieses Algorithmus finden Sie hier: Parallel projizierter Voxel-Terrain-Generator
Ich habe eine kleine Zeichnungsfunktion in Javascript erstellt, um Höhenkarten in 2d als Graustufenbild zu verschieben. http://jsfiddle.net/flawr/oy9kxpsx/
Wenn jemand von Ihnen Lust auf 3D hat und ein Skript zum Anzeigen von Karten in 3D erstellen kann, lassen Sie es mich wissen! =)