Program Flori;
uses crt, graph;
const zero:array[1..3]of longint=(0,0,0);
      V0:array[1..3]of real=(0,0,0);
type Vector=array[1..3]of real;
     Point=array[1..3] of longint;
     vec=record xy:point; v:vector; l:real;  nb:byte; end;

     TModel=object
      p:array[byte]of ^vec;
      r:array[byte]of ^point;
      ip:set of byte;
      np,i:byte;
      Tp:Point;
      Tv:Vector;
      Procedure Generate(lung,u,nRam,steps:byte;k:real);
      Procedure Drow(poz:point;u:vector;steps:byte);
     end;

var Model: TModel;
    i,j,k: Integer;
    TV   : Vector;
    gm,gd:integer;
    Page : boolean;

Procedure PSum(v1,v2:Point;var res:Point); var bt:byte; begin for bt:=1 to 3 do res[bt]:=v1[bt]+v2[bt];end;
function rad(g: real): real;begin rad:=g*pi/180;end;

procedure ChgPg;
begin
  if Page then begin
    SetActivePage(0);SetVisualPage(1,true);
    Page:=false;
  end else begin
    SetActivePage(1);SetVisualPage(0,true);
    Page:=true;
  end;
  ClearPage;
end;

 Procedure RotVec(var v:vector;u:vector);
  var r:real;
 begin
  r:=v[1];
  v[1]:=v[1]*u[1]-v[2]*u[2];
  v[2]:=   r*u[2]+v[2]*u[1];
 end;


Procedure TModel.Drow;
begin
 if steps>0 then begin
 if steps=1 then begin
 for i:=0 to np do with p[i]^ do begin
  r[i]^[1]:=poz[1]+round(xy[1]*u[2]-xy[2]*u[1]);
  r[i]^[2]:=poz[2]+round(xy[1]*u[1]+xy[2]*u[2]);
 end;
 line(poz[1],poz[2],r[0]^[1],r[0]^[2]);
 for i:=1 to np do with p[i]^ do line(r[i]^[1],r[i]^[2],r[nb]^[1],r[nb]^[2]);
 end;
///
  for i:=0 to 255 do if i in ip then begin
   delay(1);
   pSum(poz,p[i]^.xy,tp);
   tv:=p[i]^.v;
   RotVec(u,tv);
   Drow(tp,u,steps-1);
  end;
 end;
end;

Procedure TModel.Generate(lung,u,nRam,steps:byte;k:real);
 var ung:real;
 procedure Gen(s:byte;b:byte);
  var ram:byte;m:byte;
 begin
  if(s>0)then begin
   ung:=rad(random(2*u+1)-u);
   inc(np);
   new(p[np]);
   with p[np]^ do begin
    l:=(p[b]^.l)*k;
    v:=v0; xy:=zero;
    v[1]:=cos(ung);
    v[2]:=sin(ung);
    RotVec(v,p[b]^.v);
    xy[1]:=p[b]^.xy[1]+round(l*v[1]);
    xy[2]:=p[b]^.xy[2]+round(l*v[2]);
    nb:=b;
   end;
   m:=np;
   ram:=random(nRam+1);
   if ram>1 then
   repeat
    Gen(s-1,m);
    dec(ram);
   until ram=0 else ip:=ip+[np];
  end else ip:=ip+[np];
 end;
begin
 np:=0; ip:=[];
 new(p[0]);
 with p[0]^ do begin
  l:=lung;
  v:=v0;   xy:=zero;
  v[2]:=1; xy[2]:=lung;
 end;
  i:=random(nRam)+1;
   if i<2 then i:=2;
   repeat
    Gen(steps-1,0);
    dec(i);
   until i=0;
  for i:=0 to np do if r[i]=nil then new(r[i]);
end;


begin
 Randomize;

 gd:=detect;
 InitGraph(gm,gd,'');

repeat
 delay(1000);
 ChgPg;
 With Model do begin
  Generate(50,50,2,4,1);
  tv:=v0; tp:=zero;
  tp[1]:=300;  tp[2]:=100;
  tv[2]:=1;
  Drow(tp,tv,2);
 end;
until keypressed;

 closegraph;
{  for i:=0 to 255 do if i in Model.ip then write(i:4); }
halt(0);
end.