Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Fraktale Rechnungen beschleunigen


Arno-Wien - Do 01.12.05 18:13
Titel: Fraktale Rechnungen beschleunigen
Erzeugung eines Apfelmännchenbildes:


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:
 1PROCEDURE apf_beliebiger_ausschnitt;  
 2VAR m,n,i:longint;  
 3:     p:pbytearray;  
 4:     xwert,ywert,x_konst,x1_konst,y_konst,y2wert,xqu,yqu,summe,  
 5:     deltax,deltay:extended;  
 6BEGIN  
 7:  ausschnitt_check:=true;  
 8:  deltax:=(c_reel2-c_reel1)/639;  
 9:  deltay:=(c_imag2-c_imag1)/479;  
10:  y_konst:=c_imag1-deltay;  
11:  m:=0;  
12:  REPEAT  
13:    p:=a_bild.ScanLine[m];  
14:    y_konst:=y_konst+deltay;  
15:    x_konst:=c_reel1-deltax;  
16:    FOR n:=0 TO 639 DO  
17:    BEGIN  
18:      x1_konst:=x_konst+deltax;  
19:      x_konst:=x1_konst;  
20:      xwert:=0.0;  
21:      ywert:=0.0;  
22:      xqu:=0.0;  
23:      yqu:=0.0;  
24:      color:=0;  
25:      REPEAT  
26:        y2wert:=xwert*ywert;  
27:        ywert:=y2wert+y2wert-y_konst;  
28:        xwert:=xqu-yqu-x_konst;  
29:        xqu:=xwert*xwert;  
30:        yqu:=ywert*ywert;  
31:        summe:=xqu+yqu;  
32:        color:=succ(color)  
33:      UNTIL (summe > maxsum) OR (color = colormax);  
34:      IF form7.checkbox6.checked THEN  
35:      BEGIN  
36:        IF (color >= colormin) OR (color = colormax) THEN  
37:        begin  
38:          i:=3*n;  
39:          p[i]:=farbe_blau;  
40:          p[i+1]:=farbe_gruen;  
41:          p[i+2]:=farbe_rot;  
42:          form7.canvas.pixels[n,m]:=farben  
43:        end  
44:      END ELSE  
45:      BEGIN  
46:        IF (color <= colormin) OR (color = colormax) THEN  
47:        begin  
48:          i:=3*n;  
49:          p[i]:=farbe_blau;  
50:          p[i+1]:=farbe_gruen;  
51:          p[i+2]:=farbe_rot;  
52:          form7.canvas.pixels[n,m]:=farben  
53:        end  
54:      END  
55:    END;  
56:    m:=succ(m);  
57:    Application.processMessages  
58:  UNTIL (m = 480or ende;  
59:  daten_aktualisieren(werte_apf_alt);  
60:  BitBlt(bild_apf.canvas.handle,0,0,640,480,  
61:         a_bild.canvas.handle,0,0,SRCCOPY)  
62END;



Mein Problem ist die Schleife 25 -33

Alles andere ist zeitlich nicht relevant und ohne kompletten Source-Code
auch nicht immer logisch.

Ab 10 000 Iterationen (colormax) wird es mühsam.
Ab 100 000 öd.

Die Zahlen in diesem Abschnitt produzieren sicher keine Fehler.

Kann ich nicht alle Kontrollen ausschalten, zwei Werte in die Register
schieben (ST), rechnen lassen und auslesen.


Gibt es eine Lösung ( Assembler )

Arno[delphi]


F34r0fTh3D4rk - Do 01.12.05 18:17

bin ich jetzt blöd, oder hab ich den thread heute nicht schonmal gesehen ? mit mehr als 2 views und sogar lösungsansätze ? :shock:


Tilman - Do 01.12.05 19:09

nein bist du nicht, die suche im profil ergab

http://www.delphi-forum.de/viewtopic.php?t=52357&highlight=

(ich habs gemeldet)


Christian S. - Do 01.12.05 19:12

Da es da bereits einen Thread zu gibt, mache ich hier zu. :-)