Schreiben Sie ein Programm, das eine Ganzzahl von 0 bis 65535 (2 16 -1) aufnimmt und ein eindeutiges 500 × 500-Pixel-Bild erzeugt, das diesen 6 realen Bildern von rissigem Boden so ähnlich wie möglich ist:
Dies sind Miniaturansichten. Klicken Sie darauf, um die 500 × 500-Bilder in voller Größe anzuzeigen.
Ziel ist es , Ihre computergenerierten Bilder so fotorealistisch wie möglich zu gestalten . Wenn also eines der von Ihrem Programm ausgegebenen Bilder mit den obigen 6 Bildern gemischt würde, könnte jemand, der die Bilder zum ersten Mal sieht, die computergenerierten Bilder nicht von den realen unterscheiden.
Perfekter Fotorealismus ist jedoch schwierig, tun Sie also einfach das Beste, was Sie können. Dies ist ein Beliebtheitswettbewerb , bei dem Antworten mit realistischeren Ergebnissen eher positiv bewertet werden und mit höherer Wahrscheinlichkeit gewinnen.
Regeln
Sie können Bildverarbeitungsfunktionen oder Bibliotheken verwenden.
Sie können Ihren Algorithmus auf gesammelte Informationen aus den 6 Beispielbildern, aber Ihre 65536 (Basis 2 16 ) möglich Ausgabebilder sollten visuell verschieden voneinander sein und die Musterbilder, insbesondere im Hinblick auf die Anordnung der Risse. Sie müssen Ihre Bilder wirklich erstellen, nicht nur eine Auswahl aus einem bereits vorhandenen Foto drehen und übersetzen.
Ansonsten sollten Sie Ihre Ausgaben nicht hart codieren. Ein generischer Algorithmus sollte verwendet werden und Zahlen größer als 65535 sollten theoretisch gültige Ausgaben liefern. (Ich habe es nur auf ganzzahlige Typen mit kleinem Maximum beschränkt.)
Die eingegebene Ganzzahl kann als ein Keim angesehen werden, der zu einem zufälligen, gebrochenen Bodenausgabebild führt. Es sollte jedoch deterministisch sein, sodass dieselbe Eingabe immer dieselbe Ausgabe zur Folge haben sollte.
Die Ausgabebilder müssen genau 500 × 500 Pixel groß sein.
Die Ausgabebilder können in jedem gängigen Bilddateiformat gespeichert oder einfach angezeigt werden.
Stellen Sie sicher, dass Sie Ihrer Antwort einige Beispielbilder und die entsprechenden Eingabenummern hinzufügen.
Die Antwort mit den meisten Stimmen gewinnt. Die Wähler sollten natürlich die Antworten positiv bewerten, die versuchen, Bilder zu erzeugen, die den 6 Mustern ähneln, und die Antworten negativ bewerten, die gegen die Regeln verstoßen oder inkonsistente Ergebnisse liefern.
Die 6 Beispielbilder stammen von texturelib.com . Eine Auswahl von 1000 × 1000 Pixelflächen wurde aus zwei größeren Bildern von rissigem Boden getroffen und dann auf 500 × 500 verkleinert. Sie können die Analyse dieser größeren Bilder in Ihrem Programm verwenden, die Ausgabe sollte jedoch speziell die 6 ausgewählten Beispielbilder imitieren.
quelle
Antworten:
Mathematica
Ein Voronoi-Diagramm sieht wie folgt aus: Wikipedia zeigt 19 Zellen mit jeweils einem Startpunkt. Eine Zelle besteht aus dem Teilbereich von Punkten, zu denen der jeweilige Erzeugungspunkt näher liegt als zu jedem anderen Startpunkt.
Der folgende Code generiert ein Diagramm aus 80 zufälligen Punkten (im quadratischen Bereich, der durch (-1, -1) und (1,1) begrenzt ist).
Es verwendet die Polygonprimitive (in 2D) im Diagramm, um Polyeder (in 3D) zu erstellen. Stellen Sie sich vor, dass jedes Polygon direkt unter sich eine Übersetzung (-.08 in z) von sich hat. Stellen Sie sich die beiden Polygone als die Ober- und Unterseite eines Polyeders vor. "Seitenflächen" werden dann hinzugefügt, um das Polyeder zu vervollständigen.
Jedes Polyeder wird dann von der Bildmitte in der xy-Ebene nach außen verschoben. es bewegt sich von der Mitte weg. Die Größe der Verschiebung ändert sich direkt mit dem Abstand zwischen dem ursprünglichen, zufälligen Punkt des Polyeders und der Mitte des Bildschirms. Diese "Ausbreitung" der Polyeder in der xy-Ebene führt zu Spalten.
Code
quelle
Java
Ich habe einen Ansatz verwendet, der auf rekursiven Voronoi-Diagrammen basiert. Die Ausgaben sehen nicht sehr realistisch aus, aber ich denke, sie sind in Ordnung.
Hier sind einige Beispielbilder (Größe auf 250x250 angepasst, damit nicht der gesamte Bildschirm ausgefüllt wird):
0:
1:
Weitere Details zum Algorithmus:
Alle Bilder in diesem Abschnitt verwenden denselben Startwert.
Der Algorithmus generiert zunächst ein Voronoi-Diagramm mit 5 Punkten:
Wenn wir uns die Originalbilder in der Challenge ansehen, können wir sehen, dass die Linien nicht alle so gerade sind. Wir wägen den Abstand also mit einem zufälligen Wert, basierend auf dem Winkel zum Punkt. Außerdem ergeben engere Winkel engere Werte :
Jetzt zeichnen wir diese Arten von Voronoi-Diagrammen innerhalb jeder Region rekursiv mit einer dünneren und transparenteren Linie und entfernen den Hintergrund mit einer maximalen Rekursionstiefe von 3, und wir erhalten:
Jetzt fügen wir nur noch den hellbraunen Hintergrund hinzu und wir sind fertig!
Code:
Der Code besteht aus drei Klassen
Main.java
,VoronoiPoint.java
undVector.java
:Main.java
:VoronoiPoint.java
:Vector.java
: (Diese Klasse wurde aus einem meiner anderen Projekte kopiert und enthält daher unnötigen Code.)Aber ich möchte nicht ein paar Java-Klassen kompilieren!
Hier ist eine JAR-Datei, die Sie ausführen können, um diese Bilder selbst zu generieren. Ausführen als
java -jar Soil.jar number
, wonumber
sich der Startwert befindet (kann bis zu 2 31 -1 betragen) oder Ausführen alsjava -jar Soil.jar
, und der Startwert wird von selbst ausgewählt. Es wird einige Debug-Ausgaben geben.quelle
Python 3 (mit Kivy-Bibliothek und GLSL)
Erstes generiertes Bild
Python-Code:
KV-Datei:
GLSL-Code:
Die Voronoi- Funktion im GLSL-Code stammt von Íñigo Quílez. Jede Voronoi-bezogene Berechnung geschieht im Fragment-Shader vollständig mit einigen prozeduralen Rauschfunktionen, um Flecken zu erzeugen und die Linien des Voronoi-Musters ein wenig zu stören.
Durch Drücken der Leertaste wird der Startwert um 1 erhöht und ein neues Bild erstellt und als
.png
Datei gespeichert.Update: Objektivverzerrung, Vignettierung und chromatische Aberration hinzugefügt, um das Bild fotorealistischer zu machen. Sub-Voronoi-Muster hinzugefügt.
quelle
seed
. Dies wird als einheitliche Float-Variable an den Shader weitergeleitet. In der Crack-Funktion des Shaders wird das Seed verwendet, um den Punkt mit dem Seed-Wert zu übersetzen.Java
Erstellt eine Zusammenstellung von zwei Zufallsdiagrammen, die dann eine einfache Kantenerkennung durchlaufen und schließlich in das Endergebnis konvertiert werden.
Einige Ausgaben:
Einige der Zwischenschritte für diesen letzten:
(Das erste voronoi Diagramm)
(Die Zusammensetzung der beiden Voronoi-Diagramme)
(Nach dem Kantenerkennungsschritt, aber vor dem endgültigen Umfärben)
quelle