Posted By: rk (Vesela kaminka) on 'CZprogram'
Title: Vlocka
Date: Tue Apr 1 17:46:35 1997
No, svuj programek jsem nenasel, nasel jsem za to jeden priklad z knizky
Dekomposice a rekursivni programy.
Tedy tady ho mate:
program Vlocka;
uses Crt,Graph;
{Kresleni vlocky Kochove nad jednou useckou. Cela vlocka
se vytvori slozenim car nad stranami rovnostranneho troj-
uhelnika.}
var
d: real; {delka zaakladni usecky}
N: byte; {stupen krivky}
dir: integer;
Tsin,Tcos: array[0..5] of real;
DrvPath: string[80];
GrDrv,GrMod,ErrCode: integer;
p3,alfa: word;
x,y: real;
C: char;
procedure Koch(N: byte);
begin
if N=0 then {kresli usecku ve smeru dir}
begin
x:=x+Tcos[dir]; y:=y-Tsin[dir];
LineTo(Round(x),Round(y))
end
else
begin
Koch(N-1);
Inc(dir); if dir>5 then dir:=0;
Koch(N-1);
Dec(dir,2); if dir<0 then Inc(dir,6);
Koch(N-1);
Inc(dir); if dir>5 then dir:=0;
Koch(N-1)
end
end;
begin {hlavni program}
writeln('Kresleni krivek Kochove - snehova vlocka.');
writeln('Zadejte stupen krivky [0..6]: '); readln(N);
DrvPath:='C:ATP'; {cesta k adresari s grafickym driverem .BGI}
GrDrv:=Detect;
InitGraph(GrDrv,GrMod,DrvPath);
ErrCode:=GraphResult;
if Errcode<>0 then
begin
writeln('Chyba pri inicializaci grafickeho driveru.');
writeln(GrapherrorMsg(ErrCode)); Halt(1)
end;
{Graficky driver zaveden}
p3:=1; for dir:=1 to N do p3:=3*p3;
d:=GetMaxX / p3; {velikost zakladni usecky}
{Je-li velikost zakladni usecky d, pak velikost krivky
N-teho stupne je 3**N*d <= GetMaxX a z toho se urci d.}
alfa:=0;
for dir:=0 to 5 do
begin
Tsin[dir]:=d*sin(alfa*pi/180); Tcos[dir]:=d*cos(alfa*pi/180);
Inc(alfa,60)
end;
x:=0; y:=2*GetMaxY/3; MoveTo(Round(x),Round(y));
dir:=0; Koch(N);
C:=ReadKey; CloseGraph;
end.
vecne nespokojeny rk
-------------------------------------------------------------------------------
Where do foxes give Good night?