USES Graph,Crt;

CONST
  conv = 1e8;
  itt = 62;
  ZOOM = 210;

VAR
  comp : Byte;
  i,j,codeErr : Integer;
  k,l : Word;
  x0,y0,x1,y1,x,y : Double;

{Soit la suite définie par zn=xn+i*yn (avec i²=-1), zn+1 = zn² et z0=x0+i*y0.
zn+1 = zn²
     = (xn+i*yn)²
     = xn²-yn²+i*2*xn*yn
D'où xn+1 = xn²-yn² et yn+1 = 2*xn*yn

C'est ces calculs élémentaires qui sont effectués dans la double boucle sur les
lignes et colonnes de l'écran}



BEGIN
  {Ouverture de l'écran graphique en mode VGA normalement}
  i:=Detect;
  InitGraph(i,j,'c:\tp');
  CodeErr:=GraphResult;

  {Boucle sur les lignes puis les colonnes}
  FOR k:=0 TO 479 DO
  FOR l:=0 TO 639 DO
  BEGIN
    {Initialisation de la suite en fonction de la position}
    x0:=(-470+l)/Zoom;
    y0:=(-240+k)/Zoom;
    comp:=0;
    x:=0;
    y:=0;
    {On répète la suite tant que l'on n'a pas atteint un seuil}
    REPEAT
      x1:=Sqr(x);
      y1:=Sqr(y);
      y:=2*x*y+y0;
      x:=x1-y1+x0;
      Inc(comp);
    UNTIL (comp>itt) OR (x1+y1>conv);
    {Le nombre d'itérations fournit la couleur du pixel à afficher}
    PutPixel(l,k,comp MOD 16);
  END;
  Repeat Until Keypressed;
END.