Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Fraktale (https://www.delphipraxis.net/62861-fraktale.html)

Arno-Wien 10. Feb 2006 15:15


Fraktale
 
Liste der Anhänge anzeigen (Anzahl: 1)
Fraktale Apfelmännchen- und Juliamengen-Erzeugung
Interessant ist die Assembler-Beschleunigung einer Procedure in frak_un1 (siehe unten).
Bei hoher Auflösung ( Iterationen ), wie in neu_001.bmp, ca 75% ( 4 min. statt 16 ).
neu_010.bmp zeigt denselben Ausschnitt bei niedriger Auflösung. Da ist die Zeitersparnis
natürlich geringer, spielt aber auch keine Rolle mehr.
Zur Kontrolle habe ich den alten Code in Klammern stehenlassen.
Bei den anderen Proceduren gehts sowieso schnell.

Vor Gebrauch entzippen, da sonst die Bilder nicht richtig geladen werden.

Compiler-Eistellungen:
Optimization : on
Record field alignment : on
Extended syntax : on
sonst alles off


Delphi-Quellcode:
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         //nur Stack freigeben
 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 = 480) or ende;
  daten_aktualisieren(werte_apf_alt);
  BitBlt(bild_apf.canvas.handle,0,0,640,480,
         a_bild.canvas.handle,0,0,SRCCOPY)
END;
Arno


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz