Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Funktion deklarieren oder nicht? (https://www.delphipraxis.net/179394-funktion-deklarieren-oder-nicht.html)

Medium 5. Mär 2014 01:04

AW: Funktion deklarieren oder nicht?
 
@Rekursion: In diesem Fall hier (Mandelbrot Fraktal) ist Geschwindigkeit nicht ganz unwichtig, da der gesamte Prozess sonst echt lahm werden kann. Und die Iteration eines Punktes geht - wie der Name der Operation schon so freundlich suggeriert - völlig klaglos und performat iterativ. Es drängt sich in meinem Hirn sogar geradezu als der "natürliche" Weg auf. (Und ja, TCanvas.Pixels[] bremst hier mindestens genau so heftig, wenn nicht sogar noch signifikanter.) (Davon ab ist 100 als Grenz-Iterationstiefe schon ziemlich fein. Bei den meisten Zooms, die das Fraktal als ganzes noch zeigen, sind Tiefen um 30-50 bei voller HD Auflösung noch sehr gut. Je näher man ran geht, desto feiner muss man allerdings werden um alle theoretisch noch sichtbaren Details zu bekommen. Ich würde die Iterationstiefe daher entweder frei wählbar (favorit), oder vom Zoom abhängig machen.)

Furtbichler 5. Mär 2014 06:49

AW: Funktion deklarieren oder nicht?
 
Um es kurz zu machen: Bloß weil etwas rekursiv definiert ist, muss es ja nicht rekursiv umgesetzt werden.

Blup 5. Mär 2014 12:51

AW: Funktion deklarieren oder nicht?
 
Hier wegen der Vollständigkeit eine funktionierende rekursive Variante:
Delphi-Quellcode:
procedure zaehler(var za: Integer; x, y, a, b: Real);
var
  x2, y2: Real;
begin
  if za = 100 then
    Exit;

  x2 := x * x;
  y2 := y * y;
  if (x2 + y2) >= 4 then
    Exit;

  Inc(za);
  zaehler(za, x2 - y2 + a, (2 * x * y) + b, a, b);  
end;

Medium 5. Mär 2014 13:58

AW: Funktion deklarieren oder nicht?
 
Und hier eine iterative:
Delphi-Quellcode:
function zaehler(x, y, a, b: Real): Integer;
begin
  result := 0;
  repeat
    x := x*x + y*y + a;
    y := 2*x*y + b;
    Inc(result);
  until (result>100) or ((x*x+y*y)>=4);
end;

Blup 6. Mär 2014 08:46

AW: Funktion deklarieren oder nicht?
 
@Medium

Deine Berechnung ist aber Falsch:
- für die Berechnung des neuen x' muss (y * y) subtrahiert werden
- für die Berechnung des neuen y' muss das alte x in der Berechnung benutzt werden
Delphi-Quellcode:
function zaehler(x, y, a, b: Real): Integer;
var
  x2, y2: Real;
begin
  Result := 0;
  repeat
    x2 := x * x;
    y2 := y * y;
    if (x2 + y2) >= 4 then
      Break;
    y := (2 * x * y) + b;
    x := x2 - y2 + a;
    Inc(Result);
  until (result > 100);
end;

Medium 6. Mär 2014 12:29

AW: Funktion deklarieren oder nicht?
 
Ups, stimmt. Ich hatte nur den vorhandenen Code im Editor zusamengeschnippelt und nicht viel geprüft/getestet. Mir ging es eher darum zu zeigen, dass man einiges an Ballast gegenüber der Rekursion los werden kann, und sich auch die Lesbarkeit erhöht (ich finde Rekursion immer sehr aufwändig nachzuvollziehen im Kopf).


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr.
Seite 3 von 3     123   

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