Crédits à Calvin's Hobbies pour avoir poussé mon idée de défi dans la bonne direction.
Considérons un ensemble de points dans le plan, que nous appellerons des sites , et associons une couleur à chaque site. Maintenant, vous pouvez peindre tout le plan en coloriant chaque point avec la couleur du site le plus proche. C'est ce qu'on appelle une carte de Voronoï (ou diagramme de Voronoï ). En principe, les cartes de Voronoï peuvent être définies pour toute métrique de distance, mais nous utiliserons simplement la distance euclidienne habituelle r = √(x² + y²)
. ( Remarque: vous ne devez pas nécessairement savoir calculer et rendre l'un de ces éléments pour rivaliser dans ce défi.)
Voici un exemple avec 100 sites:
Si vous examinez une cellule, tous les points de cette cellule sont plus proches du site correspondant que de tout autre site.
Votre tâche consiste à approximer une image donnée avec une telle carte de Voronoï. Vous avez donné l'image dans un format graphique raster pratique, ainsi que d' un nombre entier N . Vous devez ensuite créer jusqu'à N sites et une couleur pour chaque site, de sorte que la carte de Voronoï basée sur ces sites ressemble le plus fidèlement possible à l'image d'entrée.
Vous pouvez utiliser l'extrait de pile au bas de ce défi pour rendre une carte de Voronoï à partir de votre sortie, ou vous-même si vous préférez, vous pouvez la restituer vous-même.
Vous pouvez utiliser des fonctions intégrées ou tierces pour calculer une carte Voronoï à partir d'un ensemble de sites (si vous en avez besoin).
Ceci est un concours de popularité, donc la réponse avec le plus grand nombre de votes nets gagne. Les électeurs sont encouragés à juger les réponses par
- comment bien les images originales et leurs couleurs sont approximées.
- comment l'algorithme fonctionne sur différents types d'images.
- comment l'algorithme fonctionne pour les petits N .
- si l'algorithme regroupe de manière adaptative des points dans des régions de l'image qui nécessitent davantage de détails.
Images d'essai
Voici quelques images pour tester votre algorithme (quelques-uns de nos suspects habituels, d'autres nouveaux). Cliquez sur les images pour les versions plus grandes.
La plage de la première rangée a été dessinée par Olivia Bell et incluse avec sa permission.
Si vous souhaitez relever un défi supplémentaire, essayez Yoshi avec un arrière - plan blanc et redressez sa ligne de ventre.
Vous pouvez trouver toutes ces images de test dans cette galerie imgur où vous pouvez toutes les télécharger au format zip. L'album contient également un diagramme de Voronoï aléatoire comme autre test. Pour référence, voici les données qui l’ont générée .
Veuillez inclure des exemples de diagrammes pour une variété d’images et de N différents , par exemple 100, 300, 1000, 3000 (ainsi que des corbeilles à coller conformes à certaines des spécifications de cellules correspondantes). Vous pouvez utiliser ou omettre les contours noirs entre les cellules à votre guise (cela peut sembler meilleur sur certaines images que sur d'autres). N'incluez cependant pas les sites (sauf dans un exemple séparé, si vous souhaitez expliquer le fonctionnement de l'emplacement de votre site, bien sûr).
Si vous souhaitez afficher un grand nombre de résultats, vous pouvez créer une galerie sur imgur.com , afin que la taille des réponses reste raisonnable. Vous pouvez également insérer des vignettes dans votre message et les lier à des images plus grandes, comme je l’ai fait dans ma réponse de référence . Vous pouvez obtenir les petites vignettes en ajoutant s
le nom de fichier dans le lien imgur.com (par exemple I3XrT.png
-> I3XrTs.png
). Aussi, n'hésitez pas à utiliser d'autres images de test, si vous trouvez quelque chose de bien.
Renderer
Collez votre sortie dans l'extrait de pile suivant pour rendre vos résultats. Le format de liste exact est sans importance, tant que chaque cellule est spécifiée par 5 nombres à virgule flottante dans l'ordre x y r g b
, où x
et y
sont les coordonnées du site de la cellule, et r g b
correspondent aux canaux de couleur rouge, vert et bleu de la plage 0 ≤ r, g, b ≤ 1
.
L'extrait de code fournit des options permettant de spécifier une largeur de trait des bords de la cellule et d'indiquer si les sites de cellules doivent être affichés (ce dernier principalement pour des fins de débogage). Notez toutefois que la sortie n'est restituée que lorsque les spécifications de la cellule changent. Par conséquent, si vous modifiez certaines des autres options, ajoutez un espace aux cellules ou à un autre élément.
Remerciements à Raymond Hill pour l’écriture de cette très belle bibliothèque de JS Voronoi .