Thema: Delphi Sierpinski-dreieck

Einzelnen Beitrag anzeigen

Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Sierpinski-dreieck

  Alt 28. Okt 2009, 21:19
Hier die schnelle Antwort - Das Sierpinski Dreieck basiert auf Rekursion. D.h. die Funktion, die die Zeichnung übernimmt ruft sich selbst auf:

Delphi-Quellcode:
procedure Sierpinski(a,b,c:TPoint;Rekursionstiefe:integer;aCanvas:TCanvas);
{
Sierpinski Dreieck (Rekursiv)
Algorithmus von Alleinherrscher ([url]www.delphipraxis.net[/url])
28.10.2009
}

var new_a,new_b,new_c:TPoint;
begin

with acanvas do
begin
   moveto((a.x),(a.y));
   lineto((b.x),(b.y));
   lineto((c.x),(c.y));
   lineto((a.x),(a.y));
end;

new_c.x:=(a.x+b.x ) div 2;
new_c.y:=(a.y+b.y) div 2;

new_a.x:=(b.x+c.x ) div 2;
new_a.y:=(b.y+c.y) div 2;

new_b.x:=(a.x+c.x) div 2;
new_b.y:=(a.y+c.y) div 2;

if Rekursionstiefe>0 then
begin
   Sierpinski (a,new_c,new_b,Rekursionstiefe-1,aCanvas);
   Sierpinski (new_c,b,new_a,Rekursionstiefe-1,aCanvas);
   Sierpinski (new_b,new_a,c,Rekursionstiefe-1,aCanvas);
end;

end;
Die Funktion ist schwer nachzuvollziehen, wenn man sie nicht selber programmiert hat. Sie funktioniert wie folgt:

Aufzurufen ist die Funktion als so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:TPoint;
    width:integer;
    top,left:integer;
begin

 width:=200;
 top:=300;
 left:=10;

 //Eckpunkte des äußeren Dreiecks:
 a.x:=left;
 a.y:=top;
 b.X:=width+a.x;
 b.y:=top;
 c.X:=width div 2+left;
 c.y:=round(top-sin(60/360*2*Pi)*width);

 Sierpinski(a,b,c,5,Image1.canvas);
end;
Sie berechnet die Mittelpunkte aller Seiten des Dreiecks (new_a,new_b,new_c) und verbindet diese zu einem Dreieck.
So wird das äußere Dreieck in 4 gleich große Dreiecke aufgeteilt. Nun wird die Zeichnen Funktion erneut aufgerufen mit den Koordinaten der 3 außenliegenden Dreiecke (das in der mitte liegende Dreieck soll ja leer bleiben)

Hoffe, das ist verständlich

//edit: Wäre das nicht was für die Code Library? *stolz sei*
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat