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*