uses graph, crt;
const {promitani}
  Jx = 0.5; Jy = 1; Jz = 1;
  alfa = 45*Pi/180; beta = 0*Pi/180;
  Osa = 150;
  soubor='3d_komj.txt';

type T3d = record
       x, y, z : real;
     end;

     T2d = record
       x,y : real;
     end;

     TBod = record
       d3 : T3d;    {nactu}
       d2 : T2d    {vykreslim}
     end;

     THrana = record
       zacatek, konec : byte;
       viditelna:boolean;
     end;

     TStena = record
       PocBoduSteny: byte;
       index_uzlu : array [1..10] of byte;
       predni:boolean;
     end;

    TTeleso = record
      Body : array [1..100] of TBod;
      Hrany: array [1..100] of THrana;
      Steny: array [1..100] of TStena;
      PocetBodu, PocetHran, PocetSten : byte;
    end;

var grDriver: Integer;
    grMode: Integer;
    ErrCode: Integer;
    Teleso : TTeleso;

function px(x:real) : integer;   {px Pascalove x}
begin
  px:=round(x + GetMaxX div 2);
end;

function py(y:real) : integer;   {py Pascalove y}
begin
  py:=round(GetMaxY div 2 - y);
end;

function x2d(x,y,z : real) : real;
begin
  x2d:=(-Jx*cos(alfa)*x) + (Jy*cos(beta)*y);
end;

function y2d(x,y,z : real) : real;
begin
     y2d:=(-Jx*sin(alfa)*x) - (Jy*sin(beta)*y) + (Jz*z);
end;

procedure bod2d (var Bod : TBod);
begin
    Bod.d2.x:=x2d(Bod.d3.x, Bod.d3.y, Bod.d3.z);
    Bod.d2.y:=y2d(Bod.d3.x, Bod.d3.y, Bod.d3.z);
end;

procedure Nacti (jmeno_souboru: string; var moje_teleso : TTeleso);
var pozice : byte;
    f : text;

begin
  assign(f, jmeno_souboru);
  reset(f);

  with moje_teleso do begin
    PocetBodu:=0; PocetHran:=0;

    readln(f,PocetBodu);
    for pozice:=1 to PocetBodu do begin
      readln(f,Body[pozice].D3.x,Body[pozice].D3.y,Body[pozice].D3.z);
    end;

    readln(f,PocetHran);
    for pozice:=1 to PocetHran do begin
      readln(f,Hrany[pozice].zacatek,Hrany[pozice].konec);
    end;

    readln(f,PocetSten);
    for pozice:=1 to PocetSten do begin
      Steny[pozice].PocBoduSteny:=0;
      while not eoln(f) do begin
        inc(Steny[pozice].PocBoduSteny);  {x++}
        read(f,Steny[pozice].index_uzlu[Steny[pozice].PocBoduSteny]);
      end;
      readln(f);
    end;
  end;

  close(f);
end;

procedure KresliOsy;
begin
  setcolor(blue);
  MoveTo(px(x2d(0,0,0)),py(y2d(0,0,0)));
  LineTo(px(x2d(Osa,0,0)),py(y2d(Osa,0,0)));
  OutTextXY(px(x2d(Osa,0,0))-10,py(y2d(Osa,0,0)),'x');

  MoveTo(px(x2d(0,0,0)),py(y2d(0,0,0)));
  LineTo(px(x2d(0,Osa,0)),py(y2d(0,Osa,0)));
  OutTextXY(px(x2d(0,Osa,0))+10,py(y2d(0,Osa,0)),'y');

  MoveTo(px(x2d(0,0,0)),py(y2d(0,0,0)));
  LineTo(px(x2d(0,0,Osa)),py(y2d(0,0,Osa)));
  OutTextXY(px(x2d(0,0,Osa))-10,py(y2d(0,0,Osa)),'z');
end;

procedure Vykresli(moje_teleso : TTeleso);
var index : byte;
begin
  setcolor(6);  {nulu neakceptuje}
  with moje_teleso do begin
    for index:=1 to PocetHran do begin
      MoveTo(px(Body[Hrany[index].zacatek].D2.x),py(Body[Hrany[index].zacatek].D2.y));
      LineTo(px(Body[Hrany[index].konec].D2.x),py(Body[Hrany[index].konec].D2.y));
    end;
  end;
end;

Procedure teleso2d(var moje_teleso : TTeleso);
var index : byte;
begin
  for index:=1 to moje_teleso.PocetBodu do
    bod2d(moje_teleso.Body[index]);
end;

begin
  grDriver := Detect;
  InitGraph(grDriver, grMode,' ');
  ErrCode := GraphResult;
  if ErrCode <> grOk then Exit;
  setbkcolor(white);

  Nacti(soubor,Teleso);
  KresliOsy;
  teleso2d(Teleso);
  Vykresli(Teleso);

  readln;

  CloseGraph;
  writeln('nastaveni cerne pro vykresleni hran je ignorovano, alternativne pouzita hneda');
  readln;
end.
