Beispiel: Koch4

procedure TForm1.koch4(strecke:real;ebene:byte);
begin
if ebene <> 0 then begin
koch4(strecke/3, ebene-1);
rt(90);
koch4(strecke/3, ebene-1);
rt(-90);
koch4(strecke/3, ebene-1);
rt(-90);
koch4(strecke/3, ebene-1);
rt(90);
koch4(strecke/3, ebene-1);
end else fd(strecke);
end;

Bemerkung: Das obige Beispiel wurde erhalten, indem die fraktalen Kurven für die Rekursionstiefen 1, 2, 3, etc. übereinander gezeichnet wurden. Wird zudem auf einem "PaintBox"-Objekt ausgegeben, kann der Benutzer dem Zeichenvorgang zusehen...

Beispiel: Halbrech

Dieses Fraktal entsteht durch das Zeichnen von Linien - zuerst die halbe Strecke nach rechts, dann eine Drehung um 90°, die Strecke durch 2.5 geteilt ("Verkürzungsfaktor"), die gleiche Strecke zurück und schließlich nach der Drehung von 90° die restliche halbe Strecke ....

procedure Tform1.halbrech(strecke:real;
ebene:byte);
begin
if ebene <> 0 then begin
halbrech(strecke/2,ebene-1);
rt(90);
halbrech(strecke/2.5,ebene-1);
rt(180);
halbrech(strecke/2.5, ebene-1);
rt(90);
halbrech(strecke/2, ebene-1);
end else fd(strecke);
end;


Beispiel: Fibomod (Fibonacci-Zahlen modulo 9)

procedure Tform1.fibomod(zahl1,zahl2, 
winkel:integer);
var zz:integer;
begin
dec(i);
if i>0 then begin
zz:=(zahl1+zahl2) mod 9;
fd(zz*10);
rt(winkel);
fibomod(zahl2,zz,winkel);
end;
end;

Nach einer Drehung des Zeichenstiftes um einen bestimmten Winkel (z.B. 72°) wird die Strecke verkürzt und neu gezeichnet. Dabei erhält die Strecke durch die Addition der beiden Zahlen zahl1 und zahl2 modulo 9 eine neue Länge...

Die Ausgangslänge der Strecke wird wesentlich durch die Eingabe der Zahl2 bestimmt...

Beispiel: Hilbert-Kurven

Hilbert-Kurven sind nach ihrem Erfinder D.Hilbert (1891) benannt. Sie entstehen, wenn vier Einheiten (die einem Quadrat mit einer fehlenden Seite entsprechen) mit geraden Linien verbunden werden:

Jede Kurve H(i+1) ist aus den vier Einheiten von H(i) zusammengesetzt. Dabei wird die Größe dieser Einheiten halbiert, sie werden geeignet rotiert und durch drei gerade Linien verbunden. Man kann sich H(1) aus vier Einheiten der leeren Figur H(0) zusammengesetzt denken, die durch drei Linien verbunden sind...

Wir bezeichnen die vier Teile mit A, B, C und D und die Verbindungslinien durch Pfeile: Damit erhalten wir das folgende Rekursionsschema:
A: D A A B
B: C B B A
C: B C C D
D: A D D C

Unter der Verwendung der MoveTo und LineTo - Prozedur (Objekt Canvas) werden die entsprechenden Linien gezogen. Beachte die globalen Variablen...

procedure TForm1.a(ebene:byte);
begin
if ebene<>0 then begin
d(ebene-1);
x:=x-h;
Paintbox1.Canvas.LineTo(round(x),round(y));
a(ebene-1);
y:=y-h;
Paintbox1.Canvas.LineTo(round(x),round(y));
a(ebene-1);
x:=x+h;
Paintbox1.Canvas.LineTo(round(x),round(y));
b(ebene-1);
end;
end;

procedure TForm1.b(ebene:byte);
begin
if ebene<>0 then begin
c(ebene-1);
y:=y+h;
Paintbox1.Canvas.LineTo(round(x),round(y));
b(ebene-1);
x:=x+h;
Paintbox1.Canvas.LineTo(round(x),round(y));
b(ebene-1);
y:=y-h;
Paintbox1.Canvas.LineTo(round(x),round(y));
a(ebene-1);
end;
end;

procedure TForm1.c(ebene:byte);
begin
if ebene<>0 then begin
b(ebene-1);
x:=x+h;
Paintbox1.Canvas.LineTo(round(x),round(y));
c(ebene-1);
y:=y+h;
Paintbox1.Canvas.LineTo(round(x),round(y));
c(ebene-1);
x:=x-h;
Paintbox1.Canvas.LineTo(round(x),round(y));
d(ebene-1);
end;
end;

procedure TForm1.d(ebene:byte);
begin
if ebene<>0 then begin
a(ebene-1);
y:=y-h;
Paintbox1.Canvas.LineTo(round(x),round(y));
d(ebene-1);
x:=x-h;
Paintbox1.Canvas.LineTo(round(x),round(y));
d(ebene-1);
y:=y+h;
Paintbox1.Canvas.LineTo(round(x),round(y));
c(ebene-1);
end;
end;

procedure TForm1.Hilbert1Click(Sender: TObject);
begin
e:=0;
h:=paintbox1.height-1;
x0:=h/2;
y0:=h/2;
n:=StrToInt(Inputbox('Hilbert-Kurve',
'Bitte die Rekursionstiefe angeben:','5'));
Repeat
inc(e);
h:=h/2;
x0:=x0+h/2;
y0:=y0+h/2;
x:=x0;
y:=y0;
Paintbox1.Canvas.MoveTo(round(x),round(y));
a(e);
Until e=n;
end;


Beispiel: Sierpinsky-Kurven

Die hier dargestellte Sierpinsky-Kurve entsteht durch "Zusammenhängen" von vier rekursiv erzeugten Strukturen (daher werden im entsprechenden Menüpunkt vier Prozeduren aufgerufen...).

procedure TForm1.a(ebene:byte);
begin
if ebene>0 then begin
a(ebene-1);
x:=x+h;
y:=y-h;
Paintbox1.canvas.LineTo(round(x),round(y));
b(ebene-1);
x:=x+2*h;
Paintbox1.canvas.LineTo(round(x),round(y));
d(ebene-1);
x:=x+h;
y:=y+h;
Paintbox1.canvas.LineTo(round(x),round(y));
a(ebene-1);
end;
end;

procedure TForm1.b(ebene:byte);
begin
if ebene>0 then begin
b(ebene-1);
x:=x-h;
y:=y-h;
Paintbox1.canvas.LineTo(round(x),round(y));
c(ebene-1);
y:=y-2*h;
Paintbox1.canvas.LineTo(round(x),round(y));
a(ebene-1);
x:=x+h;
y:=y-h;
Paintbox1.canvas.LineTo(round(x),round(y));
b(ebene-1);
end;
end;

procedure TForm1.c(ebene:byte);
begin
if ebene>0 then begin
c(ebene-1);
x:=x-h;
y:=y+h;
Paintbox1.canvas.LineTo(round(x),round(y));
d(ebene-1);
x:=x-2*h;
Paintbox1.canvas.LineTo(round(x),round(y));
b(ebene-1);
x:=x-h;
y:=y-h;
Paintbox1.canvas.LineTo(round(x),round(y));
c(ebene-1);
end;
end;

procedure TForm1.d(ebene:byte);
begin
if ebene>0 then begin
d(ebene-1);
x:=x+h;
y:=y+h;
Paintbox1.canvas.LineTo(round(x),round(y));
a(ebene-1);
y:=y+2*h;
Paintbox1.canvas.LineTo(round(x),round(y));
c(ebene-1);
x:=x-h;
y:=y+h;
Paintbox1.canvas.LineTo(round(x),round(y));
d(ebene-1);
end;
end;

procedure TForm1.Sierpinski1Click(Sender:...);
begin
n:=StrToInt(Inputbox('Sierpinsky-Kurve',
'Bitte die Rekursionstiefe eingeben:','5'));
h:=paintbox1.height/4-10;
e:=0;
x0:=2*h+10;
y0:=3*h+5;
Repeat
inc(e);
x0:=x0-h;
h:=h/2;
y0:=y0+h;
x:=x0;
y:=y0;
Paintbox1.canvas.MoveTo(round(x),round(y));
a(e);
x:=x+h;
y:=y-h;
Paintbox1.canvas.LineTo(round(x),round(y));
b(e);
x:=x-h;
y:=y-h;
Paintbox1.canvas.LineTo(round(x),round(y));
c(e);
x:=x-h;
y:=y+h;
Paintbox1.canvas.LineTo(round(x),round(y));
d(e);
x:=x+h;
y:=y+h;
Paintbox1.canvas.LineTo(round(x),round(y));
until e=n;
end;

Aufgabe: Formuliere ein Programm, das nur eine Seite der Sierpinsky-Kurve darstellt (Hinweis: nur ein Aufruf im Hauptprogramm, geänderte Initialisierung von x0, y0...)!

Beispiel: Schierling (?)

Dieses Fraktal ist ähnlich wie das "Baum-Fraktal" aufgebaut, allerdings treten 3 Verzweigungen auf, die zudem nicht symmetrisch sind.

procedureTForm1.schier(stamm,winkel,ebene:real);
begin
if ebene>0 then begin
fd(stamm);
rt(35);
schierling(stamm/2,winkel,ebene-1);
rt(-70);
schierling(stamm/2,winkel,ebene-1);
rt(35);
rt(winkel);
schierling(stamm/2,winkel,ebene-1);
rt(-winkel);
fd(-stamm);
end;
end;
procedure TForm1.Schierling1Click(Sender:...);
begin
x:=image1.width/2;
y:=image1.height;
a:=pi/2;
image1.canvas.moveto(round(x),round(y));
schier(200,10,7);
end;

Bemerkung: Image oder PaintBox?

Zeichnet man auf dem Canvas einer Image-Box, so werden alle Zeichenvorgänge in den Speicher geschrieben und anschließend das Ergebnis angezeigt. Das Bild ist dann beständig - es wird durch andere überlappende Bildschirmfenster nicht verändert - und es kann insbesondere mit dem Print-Befehl am Drucker ausgegeben werden.

Zeichnet man in einer PaintBox, so werden alle Zeichenvorgänge sofort sichtbar, das Bild wird jedoch durch andere Bildschirmausgaben zerstört. Damit ist weder ein Bildschirmscrollen, noch ein Ausdruck möglich.

Je nach Anwendung wird man daher eine der beiden Zeichenflächenvarianten wählen müssen.

Beispiel: Das Farnblatt

procedure TForm1.farnblatt(laenge:integer);
begin
if laenge>1 then begin
fd(laenge);
rt(-60);
farnblatt(laenge div 2);
rt(50);
farnblatt(4*laenge div 5);
rt(50);
farnblatt(laenge div 2);
rt(-40);
fd(-laenge);
end;
end;

procedure TForm1.Farn2Click(Sender: TObject);
begin
a:=0;
x:=0;
y:=image1.height/3;
image1.Canvas.MoveTo(round(x),round(y));
farnblatt(image1.Width div 5);
end;



Bemerkung: Wo liegt der Unterschied?

procedure TForm1.spirol(s,wachs:integer);
begin
if s<200 then begin
spirol(s+wachs,wachs);
fd(s);
rt(90);
end;
end;

procedure TForm1.spiral(s,wachs:integer);
begin
if s<200 then begin
fd(s);
rt(90);
spiral(s+wachs,wachs);
end;
end;