classMandelbrot{functionMandelbrot(){for($x=-19;$x<19;$x++){echo("\n");for($y=-19;$y<19;$y++){if(($out=$this->iterate($x/20.0,$y/20.0))==0)echo("*");elseecho("_");}}}functioniterate($x,$y){$cr=$y-0.5;$ci=$x;$zi=0.0;$zr=0.0;$i=0;while(true){$i++;$zr2=$zr*$zr;$zi2=$zi*$zi;// Calul de la nouvelle valeur de zlist($zr,$zi)=array($zr2-$zi2+$cr,2*($zr*$zi)+$ci);// Si le module est supérieur à 2if($zi2+$zr2>BAILOUT)return$i;// si cela fait la millieme boucle.if($i>MAX_ITERATIONS)return0;}}}$m=newMandelbrot();?>
Comment cela marche.
Rappel sur les complexes
un nombre complexe est composé d’une partie réelle et une partie imaginaire : a + i b ici a est la partie réelle et b est la partie imaginaire
le module d’un nombre complexe représente la distance entre les coordonnées du point et le centre. |module|^2 = a^2 + b ^2
la multiplication d’un nombre complexe donne (a + ib)^2 = (a^2-b^2)+2ab * i
La version simple
il existe une video en anglais qui explique cela très bien.
Je crée un tableau (x,y) de 20 * 20 qui va de [1, -1] en largeur et en hauteur
j’effectue la boucle suivante.
je calcule la valeur z1 qui est égale à z0^2 + c avec c qui est x+i*y.
puis je calcule la valeur de z2 = z1^2 + c puis z3..
je quitte la boucle pour deux raisons.
si le module est supérieur à 2, le module devient de plus en plus grand et dépasse 2.
au bout de 1000 boucles la valeurs n’a toujours pas dépassé 2. Je renvoie 0
C’est le code de la fonction iterate. le php ne connaît pas les complexes(c’est natif en python..) donc le chiffre z est divisé en 2 zr la partie réelle et zi la partie imaginaire.
12345678910111213141516171819202122232425
functioniterate($x,$y){$cr=$y-0.5;$ci=$x;$zi=0.0;$zr=0.0;$i=0;while(true){$i++;$zr2=$zr*$zr;$zi2=$zi*$zi;// Calul de la nouvelle valeur de zlist($zr,$zi)=array($zr2-$zi2+$cr,2*($zr*$zi)+$ci);// Si le module est supérieur à 2if($zi2+$zr2>BAILOUT)return$i;// si cela fait la millieme boucle.if($i>MAX_ITERATIONS)return0;}}
Si on compte le nombre d’étapes pour dépasser 2 on obtient le schéma suivant.