Neuvième Exemple: Les fractales

Script Equation Grapher n'est pas un logiciel destiné à créer des fractales. Cependant, il n'aura fallu que quelques lignes de code pour le rendre capable de tracer des images de type fractales.

Plus exactement, Script Equation Grapher va appeler le moteur de script pour chacun des pixels de l'écran, mais contrairement à l'habitude n'attend pas de valeur de retour...

Ce genre de tracé est obtenu en instanciant dans le script la variable Fractal. Le simple script Fractal=1; produit un écran uniformément coloré avec la couleur de référence de la courbe...

Le drapeau Français

Fractal=1;
K=255;
SetColor(K*(x>1),K*((x>1)&(x<2)),K*(x<2));

x varie dans l'intervalle [ 0 , 3 ]

 

[init]
{
  X0=-1; Fractal=3; K=255;
}
[Body]
{
  if(x!=X0)
  {
     SetColor(K*(x>1),K*((x>1)&(x<2)),K*(x<2));
     X0=x;
  }
}


Le script ci-contre est une version un peu plus évoluée du script précédent. Il est notablement plus rapide, puisque la couleur n'est mise à jour que à chaque changement de colonne. On peut bien sur encore améliorer le programme...

Essayez par exemple de créer l'exemple ci dessous en utilisant un timer et des fonctions un peu plus évoluées...

Vous en trouverez le source dans le répertoire exemples.

Les ensembles de Julia

Pour tracer un ensemble de Julia, on associe à chacun des points du plan (chaque pixel dans le cas de l'écran de l'ordinateur) un nombre complexe Z, qui est l'affixe du point. Si le point a comme coordonnée (x,y), alors Z=x+i.y

Ensuite, pour chaque point du plan, on effectue l'itération suivante, à la sortie de laquelle la variable COULEUR contiendra la valeur de la couleur à donner au pixel de coordonnées (x,y) :

Il faut préciser que la constante C ne peut pas prendre n'importe quelle valeur. En effet, si on vaut obtenir un bel ensemble de Julia (fractal), il faudra donner à C une valeur bien précise. Des centaines de valeurs donneront de beaux résultats, en voici quelques une :

C=-0.7927+0.1609 i C=0.32+0.043 i C=-1.1380+0.2403 i
C=-0.0986-0.65186 i C=-0.1225+0.7449 i C=-0.3380-0.6230 i
C=0.7727+0.1243 i    

Dans Script Equation Grapher, on écrira le script suivant par exemple:

[init]
{
    Fractal=1;
    Cr=-0.3380; Ci=-0.6230;
    CMax=318;
    KCol=1;
}
[Body]
{
    Zr=x; Zi=y;C=0;
    while((ComplexSqr(&Zr,&Zi)< 4) & (C<CMax) )
    {
        Zr+=Cr;
        Zi+=Ci;
        C+=1;
    }
    if(C<128) SetColor(C+C,0,0);
    else if(C<255) SetColor(255,(C-127)*2,0);
    else SetColor(255,255,(C-255)*4);
}

SEG ne sait pas gérer les complexes... On crée donc des variables séparées pour les parties réelles et imaginaires... Zr et Zi ... Cr et Ci ...

ComplexSqr est une fonction d'usage. Elle n'est pas indispensable mais accélère le tracé. Voir dans les exemples le script 95-Julia_Sans_Fonction.

Voici le résultat de l'ensemble créé par le script de gauche.

N'hésitez pas à zoomer presqu'à l'infini sur ces ensembles...

Les ensembles de Mandelbrot

Pour tracer un ensemble de Mandelbrot, on associe à la variable complexe C la valaur du point d'affixe de départ...

Dans Script Equation Grapher, on écrira le script suivant par exemple:

[init]
{
    Fractal=1;
    CMax=45;
    KCol=5;
}
[Body]
{
    Zr=x; Zi=y;C=0;
    while(ComplexSqr(&Zr,&Zi)< 4 & C<CMax )
    {
        Zr+=x;
        Zi+=y;
        C+=1;
    }
   SetColor(0,C*KCol,0);
}


 

Voici le résultat de l'ensemble créé par le script de gauche.

Précision et vitesse de calcul

Pour peu que vous ayez un ordinateur un peu poussif et que vous souhaitiez imprimez une fractale un peu complexe, vous risquez de vous endormir sur votre ordinateur... En fait, il existe un moyen d'accélérer considérablement le tracé au détriment de la qualité. La variable Fractal indique par sa présence l'algorithme fractal, mais aussi par sa valeur une subdivision de la fenêtre de tracé. Fractal=3 indiquera par exemple à SEG de ne prendre tant en x qu'en y qu'un point sur 3... Soit une accélération d'un facteur 9 de la vitesse de tracé.

Ceci est très important par exemple sur une imprimante laser noir et blanc en 600 DPI qui contient environ 32 millions de pixels noirs ou blancs... une valeur Fractal=4 ne laissera plus que 2 millions de points à calculer, mais permettra jusqu'a 16 niveaux de gris pour chacun de ces points...

Voici quelques exemples avec des valeurs de Fractal différentes:

Vous pouvez bien sur utiliser la 3D avec les fractales, attention cependant; OpenGL peut devenir très gourmand en ressources. Commencez avec une fenètre de tracé de taille modeste...

Plus loin avec les fractales