var
Form1: TForm1;
canv: Tcanvas;
//
procedure mt(x,y: integer); //moveTo
begin
form1.Image1.Canvas.moveTo(x,y);
end;
procedure pv(r,th: real); //polarvektor
var rad: real;
begin
rad := th*pi/180;
with form1.Image1.Canvas do
lineTo(round(penpos.x + r*cos(rad)),
round(penpos.y + r*sin(rad)));
end;
procedure fraktaleLinie(ordnung: integer; l, th:real);
begin
if ordnung = 0 then pv(l,th) else Begin
fraktaleLinie(ordnung - 1, l/3,th);
fraktaleLinie(ordnung - 1, l/3,th - 60);
fraktaleLinie(ordnung - 1, l/3,th + 60);
fraktaleLinie(ordnung - 1, l/3,th);
application.ProcessMessages;
End;
end;
function hoch(x: real; n: integer): real;
begin
if n <= 0 then result := 1 else result := x*hoch(x, n - 1);
end;
Beispiel :
procedure TForm1.Button1Click(Sender: TObject);
var L, ordnung, xm, ym: integer;
ganz, laenge, zaehler, nenner: extended;
begin
L := 400;
ordnung := spinedit1.Value;
if (ordnung > 5) or (Ordnung < 0) then Begin
showmessage('Ordung kann den Wert 0, 1, 2, 3, 4 oder 5 annehmen.'#13+
'Bei Werten > 5 wird nur die Länge Berechnet.');
End;
with image1.Canvas do Begin
brush.Color := RGB(255,255,255);
rectangle(0,0,width,height);
font.Size := 14;
font.Color := clred;
if ordnung > 600 then Begin
TextOut(10,10,'Länge = ' + 'fast unendlich');
exit;
End;
laenge := hoch(4/3,ordnung)*3;
ganz := int(laenge + 1E-15);
nenner := hoch(3,ordnung - 1);
zaehler := int(nenner*(laenge - ganz) + 0.5);
TextOut(10,10,'Länge = ' +
formatfloat('##.### ###',hoch(4/3,ordnung)*3) + ' LE');
if ordnung < 25 then TextOut(10,30,' = ' +
floatToStr(ganz) + ' ' + floatToStr(zaehler) + '/' +
floatToStr(Nenner) + ' LE');
if (ordnung < 0) or (ordnung >5) then exit;
xm := width div 2 - 60;
ym := height div 2;
mt(round(xm - L/2), round(ym - sqrt(3)*l/4));
fraktaleLinie(ordnung,L,0);
fraktaleLinie(ordnung,L,120);
fraktaleLinie(ordnung,L,240);
end;
end;
Keine Kommentare:
Kommentar veröffentlichen