Plus loin avec les fractales: Les quaternions

Cette page est une brève introduction aux quaternions et au moyen de les utiliser pour construire des ensembles de Julia un peu particuliers.

Qu'est ce qu'un quaternion?

Introduits par Sir William R. Hamilton, un scientifique anglais de la fin du 19° siècle, les quaternions ne sont qu'une extension des nombres complexes.

Un quaternion peut s'écrire sous la forme:

Q = x + yi + zj + wk

ou x, y, z et w sont des coefficients réels tandis que i, j et k sont les différentes racines imaginaires régies par les lois suivantes:

i² = j² = k² = -1
ij = k, jk = i, ki = j
ji = -k, kj = -i, ik = -j

Exemple: Q = 0.845 -0.5i -0.113j -0.05k

Les quaternions s'additionnent et se soustraient en additionnant ou soustraiant leurs composantes:

Q1 = x1 + y1i + z1j + w1k
Q2 = x2 + y2i + z2j + w2k
Q1 + Q2 = x1 + x2 + (y1 + y2)i + (z1 + z2)j + (w1 + w2)k

Le produit de quaternion est plus compliqué et n'est qye de peu d'utilité pour la suite. Le carré d'un quaternion Q est par contre assez simple et utille ici:

Q = x + yi + zj + wk
Q²=(x²-y²-z²-w²) +2xyi +2xzj +2xwk

On voit bien que les quaternions ne sont qu'une généralisation des nombres complexes (ce sont même de simples complexes si z et w sont nuls).

Les quaternions dans l'ensemble de Julia?

On utilisera exactement les mêmes formules que dans l'ensemble de Julia en complexe, en adoptant une méthode de colorisation différentes. Si un quaternion a divergé avant un nombre d'itération fixé, il ne sera pas dessiné, sinon la couleur utilisera une fonction f(x,y,z,w)...


Un quaternion Q0 appartient à l'endemble de Julia associé au quaternion constant C si la série définie par la formule récursive ci dessous ne diverge pas quand n tend vers l'infini:

Qn+1 = Qn² + C

Bien entendu, il n'est pas possible de représenter un espace à 4 dimensions à l'écran, on reporésentera donc par exemple l'intersection de l'ensemble avec un hyperplan défini par w=Cste...

Vous trouverez ci-dessous un exemple lié au quaternion cité plus haut. Même sur une machine rapide et en utilisant une fenêtre de rendu de petite dimension, chaque image peut demander plusieurs minutes de calculs...

[Module]
{   R=Zr+Zr+Zi*Zi+Zj*Zj+Zk*Zk;   }
[IncJulia]
{
    Tr=Zr;    Zr=Zr*Zr-Zi*Zi-Zj*Zj-Zk*Zk-Cr;
    Zi=2*Tr*Zi-Ci;    Zj=2*Tr*Zj-Cj;    Zk=2*Tr*Zk-Ck;
}
[Julia]
{
    C=0;
    Exec [Module];
    While(R<16 & C<CMax)
    {    Exec [IncJulia];   C++;   Exec [Module];    }
}
[Body]
{
    Cc=0;
    for(z=1.6; z>=-1.6; z-=0.04)
    {
        Zr=x*cos(Al)+z*sin(Al); Zj=-x*sin(Al)+z*cos(Al);
        Zi=y; Zk=0;
        Exec [Julia];
        if(C>Cc) { Cc=C; Zc=z;}
    }
    if(Cc==CMax)
    {
        if (Zc<0)            SetColor((Zc+1)*200,0,0);
        else if(Zc<=1)  SetColor(200+(Zc)*50,Zc*200,0);
        else                   SetColor(255,255,(Zc-1)*400);
    }
    else                       SetColor(255,255,255);
}
[Init]
{
        i=0; Al=0;   CMax=10; Fractal=1;
        Cr=0.845; Ci=-0.5; Cj=-0.113; Ck=-0.05;
}
[End]
{
    SnapShot("JuliaQuat",i++);
    Al=i*PI/32;
    if(i<64)    Redraw();
}

 

Les fonctions f(x,y,z)=0 ...