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?

Search the boards