Autor Beitrag
Arno-Wien
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

xp

BeitragVerfasst: Do 02.02.06 17:08 
Mitteilung zu meinem Fraktaleprogramm, mit dem ich euch schon lange nerve

ausblenden volle Höhe Delphi-Quelltext
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:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
PROCEDURE apf_beliebiger_ausschnitt;
VAR m,n,i:longint;
    p:pbytearray;
    zwei,x,y,x_k,x1_k,y_k,y2wert,xqu,yqu,summe,
    deltax,deltay:extended;

procedure laden;
asm              //ST(0)   ST(1)   ST(2)   ST(3)   ST(4)   ST(5)   ST(6)   ST(7)
 fld x_k         //x_k
 fld y_k         //y_k     x_k
 fld xqu         //xqu     y_k     x_k
 fld yqu         //yqu     xqu     y_k     x_k
 fld y           //y       yqu     xqu     y_k     x_k
 fld x           //x       y       yqu     xqu     y_k     x_k
end;

procedure rechnen;
asm              //ST(0)   ST(1)   ST(2)   ST(3)   ST(4)   ST(5)   ST(6)   ST(7)
 fmulp           //x*y     yqu     xqu     y_k     x_k
 fadd ST(0),ST(0)//2*x*y   yqu     xqu     y_k     x_k
 fsub ST(0),ST(3)//y(neu)  yqu     xqu     y_k     x_k

 fxch ST(2)      //xqu     yqu     y       y_k     x_k
 fsubrp          //xqu-yqu y       y_k     x_k
 fsub ST(0),ST(3)//x(neu)  y       y_k     x_k

 fld ST(0)       //x       x       y       y_k     x_k
 fmul ST(0),ST(1)//xqu     x       y       y_k     x_k
 fld ST(2)       //y       xqu     x       y       y_k     x_k
 fmul ST(0),ST(3)//yqu     xqu     x       y       y_k     x_k

 fld ST(1)       //xqu     yqu     xqu     x       y       y_k     x_k
 fadd ST(0),ST(1)//xqu+yqu yqu     xqu     x       y       y_k     x_k
 fstp summe      //yqu     xqu     x       y       y_k     x_k

 fxch ST(1)      //xqu     yqu     x       y       y_k     x_k
 fxch ST(3)      //y       yqu     x       xqu     y_k     x_k
 fxch ST(1)      //yqu     y       x       xqu     y_k     x_k
 fxch ST(2)      //x       y       yqu     xqu     y_k     x_k
end;

procedure poppen;
asm
 fstp x
 fstp y
 fstp yqu
 fstp xqu
 fstp y_k
 fstp x_k
end;

BEGIN
  ausschnitt_check:=true;
  deltax:=(c_reel2-c_reel1)/639;
  deltay:=(c_imag2-c_imag1)/479;
  y_k:=c_imag1-deltay;
  zwei:=2.0;
  m:=0;
  REPEAT
    p:=a_bild.ScanLine[m];
    y_k:=y_k+deltay;
    x_k:=c_reel1-deltax;
    FOR n:=0 TO 639 DO
    BEGIN
      x1_k:=x_k+deltax;
      x_k:=x1_k;
      x:=0.0;
      y:=0.0;
      xqu:=0.0;
      yqu:=0.0;
      color:=0;
      laden;
      REPEAT
      (*y:=zwei*x*y-y_k;
        x:=xqu-yqu-x_k;
        xqu:=x*x;
        yqu:=y*y;
        summe:=xqu+yqu;*)

        rechnen;
        inc(color)
      UNTIL (summe > maxsum) OR (color = colormax);
      poppen;
      IF form7.checkbox6.checked THEN
      BEGIN
        IF (color >= colormin) OR (color = colormax) THEN
        begin
          i:=3*n;
          p[i]:=farbe_blau;
          p[i+1]:=farbe_gruen;
          p[i+2]:=farbe_rot;
          form7.canvas.pixels[n,m]:=farben
        end
      END ELSE
      BEGIN
        IF (color <= colormin) OR (color = colormax) THEN
        begin
          i:=3*n;
          p[i]:=farbe_blau;
          p[i+1]:=farbe_gruen;
          p[i+2]:=farbe_rot;
          form7.canvas.pixels[n,m]:=farben
        end
      END
    END;
    m:=succ(m);
    Application.processMessages
  UNTIL (m = 480or ende;
  daten_aktualisieren(werte_apf_alt);
  BitBlt(bild_apf.canvas.handle,0,0,640,480,
         a_bild.canvas.handle,0,0,SRCCOPY)
END;


Wichtig war, dass ich die Lade- und Pop-Vorgänge aus der zeitintensiven Schleife
Zeile 73-81 herausgenommen habe. Zeitersparnis bei hochaugelösten Bildern ca.75%.
Bild neu-001 braucht statt 16 Minuten nur mehr 4. Dass sich hohe Auflösung
auszahlt, zeigt Bild neu-010 mit geringer Auflösung ( Iterationen ). Der Apfelmännchenrand hat sich bei neu_001 aufgelöst, es hat sich aber ein neuer Rand gebildet. Das Apfelmännchen ist also nur ein Gebilde der Rechenungenauigkeit und könnte
mit noch genaueren Zahlen als extended weiter aufgelöst werden.

Ich habe den alten Code In Klammern in der Schleife stehen lassen, es kann jeder
den Unterschied ausprobieren ( in frak_un1 )

Arno
Einloggen, um Attachments anzusehen!
Arno-Wien Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

xp

BeitragVerfasst: Do 02.02.06 21:26 
Für den Fall des compilierens:
Compiler:

Optimazation : on
Record field alignement : 8

Extended syntax : on

sonst alles : off

Arno
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 04.02.06 19:46 
hallo arno,

für was brauchst du denn die optimierung mit der hohen farbauflösung? das progy schaft doch nicht mehr als 16 farben!!!

war wohl vergebene liebesmüh!
Arno-Wien Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

xp

BeitragVerfasst: Sa 04.02.06 20:13 
Mit der Option Farbwahl kannst du natürlich viel mehr Farben darstellen.
Das ist aber nicht der Grund für die hohe Auflösung. Ich versuche, den Rand des Apfelmännchens immer weiter aufzulösen und notfalls wiederholen sich die Grundfarben halt. Ich weiss nicht, ob du die beiden Bilder (neu_001,neu_010) laden kannst.
Wenn ja, dann kannst du sie mit START sofort wieder neu erzeugen, die Werte werden
mitgeladen. Falls du weitere Bildbeispiele haben willst, melde dich. Ich habe viele und schicke sie gerne auch auf einer CD, als Anhang wird das zu gross.

Arno
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 04.02.06 20:32 
sorry, das hatte ich in deinem demo proggy versucht. aber jedes mal begint dieser wieder mit den 16 farben....

ist hier vielleicht ein bug? oder kann ich nur mit deinem progy nicht umgehen?

grüsse
Arno-Wien Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33

xp

BeitragVerfasst: Sa 04.02.06 20:52 
Du musst "Indiv. Farb-Wahl" einschalten.
Ich sollte das automatisieren.

Arno
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 04.02.06 20:58 
hallo arno,

einen schönen gruss nach wien. dennoch, komm ich mit dem teil nicht zurecht... das einzige was ich schaff ist es von den 16 farben auf 2 zu reduzieren.... tzzz, tzzz.....

ich gebs auf.

grüsse