Cet article est le premier d'une série consacrée à la réalisation d'une application complète: un générateur d'images fractales.
Les fractals
Les fractals sont des objets géométriques qui présentent des motifs similaires lorsqu'ils sont observés à des échelles différentes. On ne peut les évoquer sans parler de l'incontournable Benoît Mandelbrot, polytechnicien français, qui ne les a certes pas inventé, mais leur a donné leur nom, et fut le premier à leur trouver des applications: calculs du périmètres des côtes bretonnes, statistiques, et surtout — ce qui a vraiment permis leur exposition au grand public — l'imagerie informatique.
Quelques rappels sur les nombres complexes
Le calcul de l'image s'appuyant sur les nombres complexes, je vais vous rappeler les principes nécessaires ici.
Nombres complexes
Un nombre complexe est de la forme:
z = a + ib
avec i^2 = -1
-
a est appelé partie réelle
quand z représente les coordonnées d'un point, a est l'abscisse de ce point. -
b est appelé partie imaginaire
b représente l'ordonnée du point
Mise au carré
Mettons z au carré:
z * z = (a+ib)(a+ib) = a^2 + 2iab - b^2
Module
Le module de z est noté |z|.
|z|=√(a^2 + b^2).
L'ensemble de Mandelbrot
Beaucoup de gens ont déjà programmé des générateurs d'images fractales; le nôtre n'aura rien de révolutionnaire. On retrouve habituellement dans ces programmes deux ensembles: celui de Julia et celui de Mandelbrot, tous deux faciles à implémenter. Nous allons nous concentrer sur ce dernier.
Je suis bien incapable de vous expliquer le principe mathématique, mais peu importe, ce qui nous intéresse est le résultat !
La méthode de calcul
L'ensemble se calcule grâce à la suite:
z[n+1] = z[n]^2 + c
Avec z[0] = 0
z et c sont des nombres complexes:
-
c représente les coordonnées du point du plan en cours de calcul.
-
la suite z diverge après un certain nombre d'itérations — ou pas. Ce qui nous intéresse est le nombre n d'itérations nécessaire pour diverger, sachant que la suite diverge quand |z| > 2.
Il sera nécessaire de limiter le calcul à un certain nombres d'itérations.
Conversions des coordonnées
Nous utiliserons une bitmap pour composer l'image. Une bitmap est une grille de pixels. Pour notre premier exemple, j'ai choisi d'adopter des dimensions de 400 par 300 pixels.
Le calcul de l'ensemble de Mandelbrot se fait lui sur un plan mathématique. J'ai choisi de faire évoluer ses abscisses entre -2 et +2. Par conséquent ses ordonnées évolueront entre -1,5 et +1,5 pour conserver les mêmes proportions que la bitmap.
Grâce à la figure, on peut déterminer que les coordonnées se convertissent ainsi:
c.réelle = bitmapX/100 - 2
c.imaginaire = -bitmapY/100 + 1,5
La couleur
Tous les exemples d'images que vous avez dû voir sont très colorés, cependant, c'est uniquement le nombre d'itérations n qui nous donne la teinte. Pour commencer nous allons donc produire une image en niveaux de gris, 256 niveaux exactement (de 0 à 255).
nuance = (n/MaxIterations) * 255
où MaxIterations est le nombre maximal d'itération. J'ai choisi après plusieurs essais que MaxIterations = 18.
La suite
Dans le prochain billet, nous mettrons au point la première version du générateur. Ne zappez pas !
Renaud Pradenc
ceroce.com