Buddhabrot art, c, geek | 09jan09
Pour faire suite à ce ticket, voici la dernière version de mon générateur de buddhabrot suivie d’un rendu de 196Mpix (résolution de 14000×14000). Les sources C sont disponibles ici-même (license BSD) accompagnées du SConstruct qu’il faudra surement modifier pour s’aligner sur votre architecture, à supposer bien sûr que vous utilisez SCons et GCC. Par défaut :
-march=core2 -fomit-frame-pointer -O3 -pipe -Wall -m64
Quant à l’image…
J’ai cherché un moment une solution pour afficher une image haute définition sans passer par l’api Google Maps ou un serveur de traitement d’image (IIPImage aurait été parfait dans le cas contraire). Je suis tombé sur plusieurs projets plus ou moins aboutis, quelques modules flash peu pratiques, pour finalement tomber sur Seadragon de… Microsoft. Non-libre, simplement gratuit pour le moment (bien qu’ayant croisé quelques threads sur le forum du lab concernant un passage à l’une de leurs licenses open source) mais il fait son boulot et le fait bien ! Ou presque… Comme vous le verrez, c’est assez lent en plein écran.
Seadragon est la technologie de traitement d’image de masse développée chez Microsoft qui fait beaucoup parler d’elle en ce moment. On la retrouve sur Surface (leur table multi-touch) et sur l’iPhone (!) sous le nom de Seadragon Mobile, disponible gratuitement sur l’Appstore. Petite note concernant la version iPhone, elle est tout bonnement impressionnante et d’une fluidité exemplaire, à tel point que Maps semble se trainer à côté.
Une version javascript est donc disponible pour afficher ses propres images hautes-defs sur son site. Sans plus attendre et en guise d’exemple, la buddhabrot (déplacement à la souris et zoom à l’aide de la molette) :
Note pour les impatients : si l’image semble de basse qualité lors d’un zoom violent, attendez quelques secondes qu’elle se charge correctement.
Son intégration au sein d’un site est très aisée et se résume à quelques lignes de javascript que l’on trouve dans la doc. Le problème se pose lors de la génération des tiles. Microsoft fournit un outil nommé Deep Zoom Composer. Dans l’absolu, c’est de la merde. Impossible de charger correctement une image de quelques dizaines de megabytes, quelque soit le format… Une petite recherche Google a finalement abouti sur un script Python automatisant toute la procédure. Alors évidemment, pour des images de plusieurs centaines de Mpix, mieux vaut s’équiper en ram et utiliser la version 64bits de Python.
Concernant mon morceau de code, il est possible de l’optimiser de différentes façons. Par exemple, pour générer une image en noir et blanc, il suffit de se contenter d’un seul canal de couleur, ce qui, au passage, permet de diviser par trois l’usage en ram. En parlant de mémoire, générer une image de 400Mpix sera impossible avec 4Gb de ram sans swapper énormément. Pour cela, il est préférable de calculer chaque canal séparément et de les merger à la main sous Photoshop ou Gimp. Pour les geeks qui veulent s’amuser avec le code, pensez à modifier les valeurs suivantes :
const uint width = 14000, height = 14000; const ullong iterations = 50000000; const int red_threshold = 50; const int green_threshold = 600; const int blue_threshold = 5500;
Oh, et bonne année à ceux que je n’ai pas déjà vu.
(10.01.09) Edit : Pour ceux qui veulent, voilà un jpeg de la buddhabrot complète. Je conseille de faire un clique-droit/sauvegarder, l’image étant excessivement lourde.

aucun commentaire