Ecrivez un programme qui prend un nombre entier compris entre 0 et 65535 (2 16 -1) et génère une image unique de 500 × 500 pixels qui ressemble le plus possible à ces 6 images réelles de sol fissuré:
Ce sont des vignettes, cliquez dessus pour voir les images en taille réelle 500 × 500.
Le but ici est de rendre vos images générées par ordinateur aussi photoréalistes que possible . Donc, idéalement, si une des images produites par votre programme était mélangée aux 6 images ci-dessus, une personne voyant les images pour la première fois ne pourrait pas distinguer les images générées par ordinateur des autres.
Le photoréalisme parfait est cependant délicat, alors faites de votre mieux. Il s’agit d’un concours de popularité, de sorte que les réponses aux résultats plus réalistes seront davantage votées et auront plus de chances de gagner.
Règles
Vous pouvez utiliser des fonctions de traitement d'images ou des bibliothèques.
Vous pouvez baser votre algorithme sur les informations recueillies à partir des 6 exemples d’images, mais vos 65536 (2 16 ) images de sortie possibles doivent être visuellement distinctes les unes des autres et des exemples d’images, notamment en ce qui concerne la disposition des fissures. Vous devez véritablement générer vos images, ne vous contentez pas de faire pivoter et de traduire une sélection à partir d'une photo préexistante.
Sinon, vous ne devriez pas coder en dur vos sorties. Un algorithme générique doit être utilisé et les nombres supérieurs à 65535 doivent théoriquement produire des sorties valides. (Je l'ai limité simplement pour prendre en charge les types entiers de petit maximum.)
Le nombre entier en entrée peut être considéré comme une graine qui produit une image de sortie de sol fissurée de manière aléatoire. Cela devrait cependant être déterministe, de sorte qu'une même entrée devrait toujours produire le même résultat.
Les images de sortie doivent faire exactement 500 × 500 pixels.
Les images de sortie peuvent être enregistrées dans n'importe quel format de fichier d'image commun ou simplement affichées.
Assurez-vous d'inclure quelques exemples d'images de sortie dans votre réponse, ainsi que leurs numéros d'entrée correspondants.
La réponse avec le plus de votes gagne. Les électeurs devraient bien sûr choisir les réponses qui ont pour but de produire des images similaires aux 6 échantillons, et ceux qui contreviennent aux règles ou aux résultats incohérents.
Les 6 exemples d’images proviennent de texturelib.com . Des sélections de zone de 1000 × 1000 pixels ont été prises à partir de deux images plus grandes de sol fissuré, puis redimensionnées à 500 × 500. Vous pouvez utiliser l'analyse de ces images plus grandes dans votre programme, mais la sortie doit imiter spécifiquement les 6 images d'échantillonnage choisies.
la source
Réponses:
Mathematica
Un diagramme de Voronoï ressemble à ce dessin, tiré de Wikipedia, montrant 19 cellules, chacune contenant un seul point de départ. Une cellule est constituée de la sous-région de points dont le point de génération respectif est plus proche que n’importe quel autre point de départ.
Le code ci-dessous génère un diagramme à partir de 80 points aléatoires (dans la région carrée délimitée par (-1, -1) et (1,1)).
Il utilise les primitives de polygones (en 2D) du diagramme pour créer des polyèdres (en 3D). Imaginez que chaque polygone ait, juste en dessous, une traduction de lui-même (-.08 en z). Pensez aux deux polygones comme aux faces supérieure et inférieure d'un polyèdre. Des "faces latérales" sont ensuite ajoutées pour compléter le polyèdre.
Chaque polyèdre est ensuite traduit vers l'extérieur, à partir du centre de l'image, sur le plan xy; il s'éloigne du milieu. La magnitude de la translation varie directement avec la distance entre le point aléatoire d'origine du polyèdre et le centre de l'écran. Cette "dispersion" des polyèdres dans le plan xy a pour résultat des crevasses.
Code
la source
Java
J'ai utilisé une approche basée sur des diagrammes de Voronoï récursifs. Les résultats ne semblent pas très réalistes, mais je suppose qu'ils vont bien.
Voici quelques exemples d'images (redimensionnées à 250x250 pour ne pas remplir l'écran en entier):
0:
1:
Plus de détails sur l'algorithme:
Toutes les images de cette section utilisent la même graine.
L'algorithme commence par générer un diagramme de Voronoï avec 5 points:
Si nous regardons les images originales dans le challenge, nous pouvons voir que les lignes ne sont pas toutes droites, nous pesons donc la distance par une valeur aléatoire, en fonction de l'angle par rapport au point. Aussi, des angles rapprochés donnent des valeurs plus proches. :
Maintenant, nous dessinons récursivement ces types de diagrammes de Voronoï à l’intérieur de chaque région, avec une ligne plus fine et plus transparente, et retirons l’arrière-plan, avec une profondeur de récursion maximale de 3, et nous obtenons:
Maintenant, nous ajoutons simplement le fond brun pâle, et nous avons terminé!
Code:
Le code comprend trois classes
Main.java
,VoronoiPoint.java
etVector.java
:Main.java
:VoronoiPoint.java
:Vector.java
: (Cette classe est copiée depuis l'un de mes autres projets, elle contient donc du code inutile)Mais je ne veux pas compiler un tas de classes Java!
Voici un fichier JAR que vous pouvez exécuter pour générer ces images vous-même. Courir en tant que
java -jar Soil.jar number
, oùnumber
est la graine (peut être n'importe quoi jusqu'à 2 31 -1), ou en tant quejava -jar Soil.jar
, et il choisit une graine lui-même. Il y aura une sortie de débogage.la source
Python 3 (utilisant la bibliothèque Kivy et GLSL)
Première image générée
Code Python:
Fichier KV:
Code GLSL:
La fonction voronoi dans le code GLSL provient de Íñigo Quílez. Chaque calcul lié au voronoï se produit entièrement dans le fragment shader avec certaines fonctions de bruit procédural permettant de créer des mouchetures et de perturber un peu les lignes du motif de voronoï.
En appuyant sur espace, la graine sera augmentée de 1 et une nouvelle image sera générée et sauvegardée sous forme de
.png
fichier.Mise à jour: ajout de la distorsion des lentilles, du vignettage et de l'aberration chromatique pour le rendre plus réaliste. Ajout du motif sous-voronoï.
la source
seed
. Ce sera transmis au shader sous forme de variable de flottement uniforme. Dans la fonction crack du shader, la graine est utilisée pour traduire le point par la valeur de la graine.Java
Crée un composite de deux diagrammes aléatoires qui est ensuite analysé par une simple détection de contour et converti en résultat final.
Quelques sorties:
Quelques étapes intermédiaires pour cette dernière:
(Le premier diagramme de voronoï)
(Le composite des deux diagrammes de voronoï)
(Après l'étape de détection de bord mais avant la recoloration finale)
la source