INTRODUCTION AUX FRACTALES
 
 
INTRODUCTION
 

Ce document est une introduction aux fractales. Il montre comment, avec le simple concept de récursivité, des figures complexes peuvent être dessinées très facilement. La construction de trois figures est détaillée ici: le "dragon", le "flocon de neige" et la "vague". Elle est illustrée par l'applet écrite en Java, pour laquelle le code source est disponible.

 
LA FRACTALE "DRAGON"
 

La construction des fractales est basée sur une idée de récursivité. Si on regarde une fractale à des échelles différentes, on retrouve le même motif. C'est ce motif qui est la base de la fractale. En effet, pour construire une fractale, on considère une forme très simple. Dans le cas du dragon, il s'agit du motif suivant.

ABC forme un triangle isocèle rectangle en C, C se trouvant à gauche du vecteur AB. Pour dessiner le dragon, on se base sur la récursivité suivante.

Pour dessiner un dragon du point A au point B, il faut dessiner un dragon du point C au point A et un dragon du point C au point B, C étant tel que le triangle ABC est isocèle rectangle en C et que C se trouve à gauche du vecteur AB.

Tentons de dessiner un dragon à partir de cette récursivité. On choisit deux points A et B.

Tracer un dragon de A à B revient à tracer un dragon de C à A et un autre de C à B.

Tracer un dragon de C à A revient à tracer un dragon de D à C et un autre de D à A. De même, tracer un dragon de C à B revient à tracer un dragon de E à C et un autre de E à B.

Tracer un dragon de D à C revient à tracer un dragon de G à D et un autre de G à C. De même, tracer un dragon de D à A revient à... On pourrait continuer indéfiniment la récursivité. La première chose à faire quand on dessine une fractale est de fixer une profondeur de récursivité, c'est-à-dire le nombre de fois que l'on applique la récursivité. Ici, on va s'arrêter à trois, ce qui correspond au moment où il faut tracer les dragons suivants: F à A, F à D, G à D, G à C, H à C, H à E, I à E, I à B. Et au lieu de continuer à appliquer la récursivité, on décide qu'un dragon se dessine simplement par une ligne et on obtient la fractale de profondeur 3 suivante.

Les fractales telles qu'on les connaît ont simplement été dessinées avec une profondeur plus importante. Dessiner une fractale peut paraître compliqué quand la profondeur est importante, mais en fait, c'est très simple à programmer. En effet, voici la fonction qui permet de tracer la fractale dragon du point A au point B avec une profondeur p.

fonction tracerDragon(A,B,p):
 si (p = 0) alors
  tracerLigne(A,B);
 sinon
  C  /* Calcul de C */;
  tracerDragon(C,A,p - 1);
  tracerDragon(C,B,p - 1);
 fin si;
fin fonction;

Il faut juste déterminer maintenant les coordonnées (xc;yc) du point C. Rappelons que ABC est un triangle isocèle rectangle en C.

D'après la figure, le triangle AC'C est également isocèle rectangle en C'. Si on considère le vecteur AB' comme étant perpendiculaire à AB et de même longueur, on peut alors calculer C de la manière suivante.

 A + AB / 2 + AB' / 2     xc  xa + (xb - xa) / 2 - (yb - ya) / 2
yc  ya + (yb - ya) / 2 + (xb - xa) / 2

Voici la fractale dragon à profondeur 12.

 
LA FRACTALE "VAGUE"
 

Le principe de construction de cette fractale est identique à celui de la fractale dragon. On considère le motif suivant.

Le point M est le milieu du segment [AB], ses coordonnées (xm;ym) s'expriment:

 (A + B) / 2     xm  (xa + xb) / 2
ym  (ya + yb) / 2

Le triangle AMC est isocèle rectangle en C et le triangle MDB est isocèle rectangle en D. C se trouve à droite et D se trouve à gauche de AB. Les coordonnées de C et D se calculent en utilisant la formule établie pour calculer le point C de la fractale dragon.

La fonction qui permet de tracer la fractale vague de A à B à une profondeur p s'écrit:

fonction tracerVague(A,B,p):
 si (p = 0) alors
  tracerLigne(A,B);
 sinon
  C  /* Calcul de C */;
  D  /* Calcul de D */;
  tracerVague(A,C,p - 1);
  tracerVague(C,D,p - 1);
  tracerVague(D,B,p - 1);
 fin si;
fin fonction;

Voici la fractale vague à profondeur 11.

 
LA FRACTALE "FLOCON DE NEIGE"
 

La construction de cette fractale repose sur le motif suivant.

C de coordonnées (xc;yc) se trouve sur la droite (AB) à un tiers de la distance ||AB|| de A. De même, D de coordonnées (xd;yd) se trouve sur la droite (AB) à un tiers de la distance ||AB|| de B. Leurs coordonnées se calculent donc:

 A + AB / 3
 B - AB / 3
    xc  xa + (xb - xa) / 3
yc  ya + (yb - ya) / 3
xd  xb - (xb - xa) / 3
yd  yb - (yb - ya) / 3

E est tel que CED forme un triangle équilatéral.

Si on considère le vecteur CD' comme étant perpendiculaire à CD et de même longueur, on peut alors calculer les coordonnées (xe;ye) de E de la manière suivante.

  C + CD cos(60)
    + CD' sin(60)
    xe  xc + (xd - xc) / 2 - (yd - yc) 3 / 2
ye  yc + (yd - yc) / 2 + (xd - xc) 3 / 2

La fonction qui permet de tracer la fractale de A à B à une profondeur p s'écrit:

fonction tracerFlocon(A,B,p):
 si (p = 0) alors
  tracerLigne(A,B);
 sinon
  C  /* Calcul de C */;
  D  /* Calcul de D */;
  E  /* Calcul de E */;
  tracerFlocon(A,C,p - 1);
  tracerFlocon(C,E,p - 1);
  tracerFlocon(E,D,p - 1);
  tracerFlocon(D,B,p - 1);
 fin si;
fin fonction;

Pour tracer le flocon en entier, il faut lancer trois fois le traçage de la fractale. Pour cela, on choisit trois points X, Y et Z qui forment un triangle équilatéral.

Puis on trace des fractales de X à Y, de Y à Z et de Z à X avec la même profondeur.

tracerFlocon(X,Z,p);
tracerFlocon(Z,Y,p);
tracerFlocon(Y,X,p);

Voici la fractale flocon de neige à profondeur 4.