Ahoj, můžete mi prosím pomoci zjistit, co to můj program vyvádí? Jeho úkolem je vykreslovat fraktály jako Kochova vločka a její obdoby s různým počátečním útvarem. Má fungovat v konečném počtu kroků (kupodivu :D ) a v každém kroku přidá novou "vrstvu". Tj. první krok udělá trojúhelník apod, další udělá 6cípou hvězdu atd., a však už při třetím kroku se mi v polovině "vrstvy" (první polovina je bez zádrhelu) začnou objevovat prapodivná čísla a při 4. kroku se přibližně ve stejné oblasti, kde se objevuje první anomálie zasekne. Matematický podklad mám bezchybný (za to dám cizí ruku do ohně).
program vlocka;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp,crt,math
{ you can add units after this };
const pocetperiod=5;
rad='perioda';
fr='Fraktal\';
tx='.txt';
poctvar=3;
type bod=record
x,y:real;
end;
var x,y,x0,y0,u1,u2,v1,v2:real;
i,j:byte;
A,A0,B:bod;
F:array[1..pocetperiod] of text;
Fname:array[1..pocetperiod] of string;
g:text;
Aname,Bname,Name1,Name2:string;
function strtoreal(str:string):real; //fungujici bezchybne
var Ccast:byte;
Dcast:real;
i,i0:byte;
begin
i:=2;
case str[1] of
' ':
begin
Ccast:=StrToInt(str[2]);
i:=i+1;
end;
'-':
begin
Ccast:=-StrToInt(str[2]);
i:=i+1;
end;
else
Ccast:=StrToInt(str[1]);
end;
i0:=i;
Dcast:=0;
repeat
i:=i+1;
Dcast:=Dcast+StrToInt(str[i])*power(10,i0-i);
until(i=Length(str));
if str[1]='-' then strtoreal:=Ccast-Dcast
else strtoreal:=Ccast+Dcast;
end;
begin
CreateDir('Fraktal'); //vytvor slozku
for i:=1 to pocetperiod do
begin
Fname[i]:=fr+rad+IntToStr(i)+tx; //vytvor textaky pro souradnice
assign(F[i],Fname[i]);
rewrite(f[i]);
close(f[i]);
end;
x:=cos(pi/2); //x prvniho bodu
y:=sin(pi/2); //y prvniho bodu
append(f[1]);
writeln(F[1],x:0:6,',',y:0:6); //zapis prvni bod do prvniho textaku
for i:=2 to poctvar+1 do
begin
x:=cos(pi/2-((i-1)*2*pi)/(poctvar)); //x nasledujicich bodu (pootoceno vzdy o 2Pi/n)
y:=sin(pi/2-(2*pi*(i-1))/(poctvar)); //y -||-
writeln(F[1],x:0:6,',',y:0:6); //zapis x,y
end;
close(f[1]); //prvni textak je hotovy a funguje
//----------------------------------------------------------------------------------------------------
for i:=2 to pocetperiod do
begin
reset(f[i-1]); //otevre predchozi textak ke cteni
append(F[i]); //otevre nynejsi textak(prazdny) k zapisu
readln(F[i-1],Name1); //precte prvni bod(0,1)d z predchoziho textaku
j:=0;
Aname:='';
repeat
j:=j+1;
Aname:=Aname+Name1[j];
until(Name1[j+1]=',') ;
A.x:=strtoreal(Aname); //x prvniho bodu v cisle (0)
j:=j+1;
Bname:='';
repeat
j:=j+1;
Bname:=Bname+Name1[j];
until(j=Length(Name1));
A.y:=strtoreal(Bname); //y -||- (1)
writeln(F[i],Name1); //zapis bodu A do noveho textaku
A0:=A; //ulození hodnoty bodu A
while not eof(F[i-1]) do
begin
readln(F[i-1],Name2); //nacteni bodu B z predchoziho textaku
j:=0;
Aname:='';
repeat
j:=j+1;
Aname:=Aname+Name2[j]; //prevod z textu na cisla
until(Name2[j+1]=',') ;
B.x:=strtoreal(Aname); //x bodu B
j:=j+1;
Bname:='';
repeat
j:=j+1;
Bname:=Bname+Name2[j];
until(j=Length(Name1));
B.y:=strtoreal(Bname); //y bodu B
x:=((2*A.x)+B.x)/3; //x bodu ve tretine usecky mezi A a B (blize A)
y:=((2*A.y)+B.y)/3; //y -||-
x0:=x;
y0:=y;
writeln(F[i],x:0:6,',',y:0:6); //zapis vyse zmineneho bodu
u1:=x-A.x; //x vektoru z A do X
u2:=y-a.y; //y -||-
v1:=u1*cos(Pi-(2*Pi)/poctvar)-u2*sin(Pi-(2*Pi)/poctvar);
v2:=u2*cos(Pi-(2*Pi)/poctvar)+u1*sin(Pi-(2*Pi)/poctvar);
x:=v1+x;
y:=v2+y;
writeln(F[i],x:0:6,',',y:0:6); //zapis nalezeneho bodu
if poctvar>3 then //pro pocatecni tvar s vice uhy nez 3
for j:=1 to poctvar-3 do //pocet bodu, ktere jsou mimo usecku AB
begin
u1:=x-x0;
u2:=y-y0;
v1:=u1*cos(Pi-(2*Pi)/poctvar)+u2*sin(Pi-(2*Pi)/poctvar);
v2:=u2*cos(Pi-(2*Pi)/poctvar)-u1*sin(Pi-(2*Pi)/poctvar);
x0:=x;
y0:=y;
x:=v1+x;
y:=v2+y;
writeln(F[i],x:0:6,',',y:0:6);//zapis dalsich bodu
end;
x:=(A.x+2*B.x)/3;
y:=(A.y+2*B.y)/3;
writeln(F[i],x:0:6,',',y:0:6);
writeln(F[i],B.x:0:6,',',B.y:0:6);
A:=B;
end;
writeln(F[i],A0.x:0:6,',',A0.y:0:6);
close(F[i]);
close(F[i-1]);
end;
end.