Inspiré de vi.sualize.us
Objectif
L'entrée est une image en niveaux de gris et la sortie est une image en noir et blanc. L'image de sortie est constituée d'une seule courbe fermée (boucle) qui ne peut se croiser ni se toucher. La largeur de la ligne doit être constante sur toute l'image. Le défi ici est de trouver un algorithme pour le faire. La sortie doit simplement représenter l'image d'entrée, mais avec n'importe quelle liberté artistique. La résolution n’est pas très importante, mais le rapport d’aspect devrait rester à peu près le même.
Exemple
Plus d'images de test
The width of the line shall be constant throughout the whole image.
Mais toujours un indice utileRéponses:
Java: style matriciel
Comme personne n'a encore répondu à la question, je vais tenter le coup. Je voulais d’abord remplir une toile avec des courbes de Hilbert, mais au final j’ai opté pour une approche plus simple:
Voici le code:
Mise à jour : Maintenant, il crée un cycle, pas seulement une seule ligne
la source
Python: courbe d'Hilbert (
373361)J'ai décidé de dessiner une courbe de Hilbert à granularité variable en fonction de l'intensité de l'image:
En fait, j'avais prévu de prendre des décisions à différents niveaux de détail, par exemple "Ce spot est tellement lumineux que je vais arrêter la récursion et passer au bloc suivant!". Mais évaluer localement l'intensité de l'image menant à de grands mouvements est très imprécis et a l'air moche. Je me suis donc retrouvé avec seulement la décision de sauter le niveau 1 ou de dessiner une autre boucle de Hilbert.
Voici le résultat sur la première image de test:
Grâce à @githubphagocyte, le rendu est assez rapide (utilisation
turtle.tracer
). Ainsi, je n'ai pas à attendre toute la nuit pour obtenir un résultat et je peux aller dans mon lit bien mérité. :)Un code de golf
@flawr: "programme court"? Vous n'avez pas vu la version golfée! ;)
Alors juste pour le plaisir:
(
373361 caractères. Mais cela prendra une éternité puisque je supprime laturte.tracer(...)
commande!)Animation par flawr
flawr: Mon algorithme est légèrement modifié par rapport à ce que @DenDenDo m'a dit: je devais supprimer des points à chaque itération car la convergence ralentirait considérablement. C'est pourquoi la courbe se coupera d'elle-même.
la source
screen.tracer(0)
au lieu deturtle.speed(0)
. Vous devrez peut-être instancier l'écran au début, mais s'il s'agit de la seule instance d'écran, toutes vos tortues seront automatiquement affectées. Puis justescreen.update()
à la fin pour afficher les résultats. J'ai été surpris par la différence de vitesse quand j'ai découvert ce ...Python 3.4 - Problème de vendeur itinérant
Le programme crée une image tramée à partir de l'original:
Pour chaque pixel noir, un point est généré aléatoirement près du centre du pixel et traité comme un problème de voyageur de commerce . Le programme enregistre un fichier html contenant une image SVG à intervalles réguliers dans le but de réduire la longueur du chemin. Le chemin commence par s'entrecroiser et le devient progressivement sur plusieurs heures. Finalement, le chemin n'est plus auto-intersectant:
Le programme utilise 3 approches différentes pour améliorer la solution et mesure la performance par seconde pour chacune. Le temps alloué à chaque approche est ajusté pour donner la majorité du temps à l’approche la plus performante à ce moment.
J'ai d'abord essayé de deviner quelle proportion de temps allouer à chaque approche, mais il s'avère que l'approche la plus efficace varie considérablement au cours du processus. Il est donc très important de continuer à s'adapter automatiquement.
Les trois approches simples sont:
Pour l'approche 3, une grille est utilisée, répertoriant toutes les lignes qui traversent une cellule donnée. Au lieu de vérifier l'intersection de chaque ligne de la page, seules les lignes ayant une cellule de grille commune sont cochées.
J'ai eu l'idée d'utiliser le problème de voyageur de voyage dans un article de blog que j'avais vu avant que ce défi ne soit publié, mais je ne pouvais pas le retrouver lorsque j'ai posté cette réponse. Je crois que l’image du défi a été produite en utilisant une approche de voyageur de commerce, combinée à une sorte de lissage de trajectoire pour éliminer les virages serrés.
Je ne trouve toujours pas l'article de blog spécifique, mais j'ai maintenant trouvé une référence aux documents originaux dans lesquels Mona Lisa avait été utilisée pour démontrer le problème du vendeur ambulant .
La mise en œuvre du TSP ici est une approche hybride que j’ai expérimentée avec plaisir pour relever ce défi. Je n'avais pas lu les documents liés quand j'ai posté ceci. Mon approche est douloureusement lente en comparaison. Notez que mon image utilise moins de 10 000 points et qu'il faut plusieurs heures pour converger suffisamment pour ne pas avoir de lignes croisées. L'exemple d'image dans le lien vers les journaux utilise 100 000 points ...
Malheureusement, la plupart des liens semblent morts, mais le document "TSP Art" de Craig S Kaplan & Robert Bosch 2005 fonctionne toujours et donne un aperçu intéressant des différentes approches.
la source
Java - Oscillations
Le programme trace un chemin fermé et ajoute des oscillations dont l'amplitude et la fréquence sont basées sur la luminosité de l'image. Les "coins" du chemin n'ont pas d'oscillations pour s'assurer que le chemin ne se croise pas.
Ci-dessous, un algorithme comparable basé sur une spirale. ( Je sais que le chemin ne ferme pas et qu'il se croise certainement , je le publie pour l'amour de l'art :-)
la source
Java - Chemin récursif
Je pars d'un chemin 2x3 fermé. Je balaye chaque cellule du chemin et le divise en un nouveau sous-chemin 3x3. J'essaie chaque fois de choisir le sous-chemin 3x3 qui "ressemble" à l'image d'origine. Je répète le processus ci-dessus 4 fois.
Voici le code:
la source