Bonjour,

Voila sous Lazarus 1.0.10 sous ubuntu 13.10 , j'ai voulu m'amuser a me faire mon petit programme de génération d'image fractale ( je sais il en existe plein en cherchant sur le web , mais ça fait plus plaisir de chercher a comprendre le pourquoi du comment )
Je me suis inspiré d'un site qui explique très la méthode adaptable a tout style de programmation

Après quelques erreurs de variable et autre j'ai réussi a le lancer pour une image de 800x600
or on dira en coordonnée de l'image [0,712] j'ai eu l'erreur "Runtime error 207" suivant la faq , j'ai donc penser a une erreur de calcul division par zéro ou autre ...
Or après plusieurs essai sur une image de 320x200 j'en réalise 1/4

J'en déduit donc que c'est le calcul récursif provoque le débordement de la pile ( ce que l'on a pas en PHP )

pourtant je ne fait au maximum 32 itérations, donc existe moyen de "nettoyer" la pile pour éviter le débordement

Merci de votre aide ou piste de travail

voici le code et variable sur un Tbutton qui lance le calcul

centx,centy pour centrer l'image en x et y
zoom la résolution ou zoom
Mxiti le nombre d'itération maximal
lgx et lgy la taille de l'image

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
procedure TForm1.Button1Click(Sender: TObject);
 
var
  MIti       : integer ;
  iti        : integer ;
  x,y        : real;
  ech        : real;
  Vx,Vy      : real;
  i,j        : integer;
  zi,zr,tmp  : real;
 
begin
 
  Miti:=StrToInt(MxIti.Text);
  ech:=StrToInt(zoom.Text);
  // calcul des bornes de l'image
  x:=-StrToInt(LgX.Text)/2/ech+StrToFloat(centx.Text);
  y:=-StrToInt(LgY.Text)/2/ech+StrToFloat(centy.Text);
  img.Height:=StrToInt(LgY.Text);
  img.Width:=StrToInt(LgX.Text);
  img.Picture.Clear;
  for j:=0 to img.Height do
    for i:=0 to img.Width do
      begin
        iti:=0;
    zi:=0;
    zr:=0;
    vx:=i/ech+x;
    vy:=j/ech+y;
    while (iti<Miti) and ((zr*zr-zi*zi)<4) do
          begin
        iti:=iti+1;
        tmp:=zr;
        zr:=zr*zr-zi*zi+vx;
            zi:=2*zi*tmp+vy;
         end;
        if (iti<miti) then
          begin
            img.Canvas.Pixels[i,j]:=RGBToColor(round(iti*255/miti),0,0);
            //application.ProcessMessages;
          end;
        if (iti=miti) then
          begin
            img.Canvas.Pixels[i,j]:=RGBToColor(255,255,0);
            //application.ProcessMessages;
          end;
        end;
  messageDlg('Rendu fini',MtInformation,[MbOk],0);
end;