Ihre Aufgabe ist es, eine Höhenkarte zu erstellen und diese als parallel projizierte Voxellandschaft anzuzeigen. Die Regeln sind die folgenden:
- Die (Höhenkarte der) Landschaft muss zufällig generiert werden
- Sie müssen auch beschreiben, wie der von Ihnen verwendete Algorithmus funktioniert, damit jeder hier etwas Neues lernen kann
- Sie müssen auch entweder ein Bild generieren oder die generierte Landschaft auf dem Bildschirm anzeigen
- Das resultierende Bild muss parallel projiziert werden (also nicht perspektivisch), und es kann nur Voxel enthalten (also muss es aus kleinen Kästchen bestehen).
- Dies ist ein Beliebtheitswettbewerb, daher möchten Sie Ihrem Programm möglicherweise einige zusätzliche Funktionen hinzufügen, um mehr Upvotes zu erhalten.
- Der Gewinner ist die am besten bewertete gültige Antwort 7 Tage nach der letzten gültigen Einreichung. Alle gültigen Einsendungen müssen den Regeln entsprechen, einschließlich der Beschreibung des verwendeten Algorithmus. Sie können zusätzliche Funktionen hinzufügen, die einigen Regeln nicht entsprechen (wie das Hinzufügen eines Perspektivenmodus). In diesem Fall müssen sie jedoch optionale Funktionen sein (z. B. wenn sie deaktiviert werden, sollte das Ergebnis allen Regeln entsprechen).
- Mein Beitrag zählt nicht als gültig.
Ein Beispiel für ein Ergebnisbild ist das folgende:
Wenn Sie einige Algorithmen benötigen, überprüfen Sie diese hier
Antworten:
Python2 3D-Funktionsplotter Voxel Edition
Dies ist meine Teilnahme an diesem Wettbewerb:
Wie im Titel klar angegeben, funktioniert es als 3D-Funktionsplotter, aber da dieser Wettbewerb erfordert, dass das Terrain zufällig generiert wird, ist es diese zufällige Sinusfunktion,
1.5*(math.sin(1/randA*x+randC)+math.sin(1/randB*y+randD))
die von 4 Zufallsvariablen abhängt. Das schafft Terrains wie dieses:Wir können natürlich diese Zufallsfunktion durch eine 2 variable Funktion ersetzen, zum Beispiel
sin(sqrt((x/2)²+(y/2)²))*3
gibt dieses Terrain:und
-x*y*e^(-x^2-y^2)
gibt dies aus:(die grafischen Darstellungen auf der rechten Seite werden von Wolfram Alpha berechnet)
Und während wir dabei sind, zeta Riemann entlang des kritischen Streifens:
Für die Leute, die damit nicht vertraut sind, wie Sie sehen können, liegen diese Wasserbecken (die die Nullstellen der Funktion darstellen) alle auf einer geraden Linie (Realteil = 0,5). Wenn Sie dies beweisen können, erhalten Sie 1000000 $! Siehe diesen Link.
Ich hoffe du magst es!
quelle
C #, WPF
Ich habe mit einem zufälligen Spaziergang experimentiert , der besser funktioniert, als ich erwartet hatte. Ich beginne irgendwo auf der Karte, gehe zu einer zufälligen benachbarten Kachel und erhöhe deren Höhenwert , gehe dann zur nächsten und so weiter. Dies wird tausende Male wiederholt und führt schließlich zu einer Höhenkarte wie dieser (100 x 100):
Dann "diskretisiere" ich die Karte, reduziere die Anzahl der Werte auf die angegebenen Höhenstufen und ordne Terrain / Farbe basierend auf dieser Höhe zu:
Weitere ähnliche archipelähnliche Gebiete:
Die Anzahl der zufälligen Stufen und Höhenstufen wurde erhöht, um bergigeres Gelände zu erhalten:
Code
Features: Erstellen Sie Terrain mit einem Knopf. 3D-Gelände und 2D-Karte anzeigen. Zoomen (Mausrad) und 3D-Scrollen (Pfeiltasten). Aber es ist nicht sehr performant - schließlich ist dies nur in WPF geschrieben, nicht in DirectX oder OpenGL.
MainWindow.xaml:
MainWindow.xaml.cs
quelle
JavaScript und Crafty.JS, um vieles zu verbessern
Hier ist eine Beispielausgabe:
Und hier ist der Code (vollständige Webseite):
Hier ist
sprite.png
:Jetzt habe ich ein paar Dinge zu sagen.
Verurteile mich nicht für diesen schrecklichen Code! : PI schrieb es vor vielen Jahren, als ich eine schreckliche Programmierung war. Tatsächlich ist es aus den alten Tagen der Website, die ich hatte, dass ich mich nicht einmal daran erinnerte, was ich hatte! http://oddllama.cu.cc/terrain/
Ich habe so ziemlich jede Menge Code aus der Crafty.JS Isometric-Demo kopiert . : P
Erklärung wird bald kommen! Ich muss jetzt schlafen gehen, da es spät hier ist. (Das ist auch der Grund, warum das Sprite so schrecklich ist!)
Grundsätzlich ist es wirklich unpoliert und wird später noch erheblich verbessert!
Es wird der gleiche Diamantquadrat-Algorithmus verwendet, der in der Antwort des OP erwähnt wurde.
quelle
Ruby + RMagick
Ich benutze den Diamond-Square- Algorithmus , um die Höhenkarte zu generieren.
Der Algorithmus in Kürze:
[0,0] == [4,0] == [0,4] == [4,4]
. Auch[-2,0] == [2,0]
, etc.[0,0]
eine zufällige Farbe ein[0,0] == [4,0] == [0,4] == [4,4]
)Da dies zu einem langweiligen, grauen Bild führt, müssen Sie diesem Wert bei jedem Schritt eine Zufallszahl hinzufügen. Es wird bevorzugt, dass sich dieser Zufallswert bei der ersten Iteration über den gesamten Bereich erstreckt, sich jedoch mit der Zeit verringert, wenn Sie immer kleinere Teilmengen des Arrays ansprechen. Je weniger diese Zufälligkeit mit der Zeit abnimmt, desto rauschreicher wird das Bild.
Nachdem ich fertig bin, ordne ich einfach eine Farbe für jeden Höhenwert zu.
Code:
generate.rb
Gemfile
Hinweis: Der von mir verwendete Imagemagick ist 16-Bit
Ergebnisbild:
Hinweis: Bei diesem Bild handelt es sich um eine isometrische Darstellung von oben nach unten, wobei die Größe eines Voxels genau ein Pixel beträgt, sodass es gemäß den Regeln gültig ist (mit der Ausnahme, dass meine Antwort als ungültig gilt).
quelle
Java (mit dem Farbbild von @ fejesjoco als Basisalgorithmus)
Nachdem ich ein bisschen mit den FullRGB-Farbbildern von @fejesjoco herumgespielt hatte, bemerkte ich, dass sie als Basis für interessante Klippenvoxellandschaften dienen könnten. Anstatt den Algorithmus neu zu implementieren, habe ich seinen Code als externe ausführbare Datei verwendet (laden Sie ihn von http://joco.name/2014/03/02/all-rgb-colors-in-one-image/ herunter und platzieren Sie ihn mit dem Namen artgen. exe im selben Verzeichnis)
Vorschau:
verwendete Höhenkarte (im blauen Kanal gespeichert)
Eingabebild:
Der Subalgorithmus, den ich verwende, funktioniert folgendermaßen:
1. Sortieren
2. Beginnen Sie mit einem schwarzen Pixel in der Mitte
3. Bis alle Farben verwendet sind: Platzieren Sie die aktuelle Farbe an der nächsten passenden Stelle und fügen Sie die nicht verwendeten Nachbarn als neue verwendbare Stellen hinzu Wenn es fertig ist
red&(green|blue)
, zerlege ich es, um es auf 256 verschiedene Werte zu reduzieren. 4. Dann verwende ich vorgenerierte Sprites und erstelle das Bild schichtweisequelle
HTML + JavaScript
Hier ist mein Versuch beim Wettbewerb:
Ich benutze den euklidischen F1- Zellrauschen- Algorithmus, um eine Höhenkarte zu generieren, die ich dann in ein Bild umwandle, indem ich die entsprechende Farbe aus einem Array nehme und ein Quadrat mit einer Höhe von 10 x 10 y zeichne, damit höhere Pixel angehoben werden. Ich zeichne dann ein Rechteck als Seite mit der gleichen Farbe aus einem anderen Array.
Hier ist derselbe Code, der einen Zufallsalgorithmus mit 10.000 Schritten verwendet:
! [Random Walk 2] [4]
Wenn es von einer Kante "abläuft", wird es auf die andere gewickelt, sodass es immer noch gut gekachelt aussieht.
Es ist immer noch technisch parallel, nur aus einem anderen Blickwinkel.
quelle