{26.8.2003-
Jozef Sivek ml.}
program eli003;
uses graph,crt;
type pole_v=array[1..3] of real;
var  gd,gm,monitor,xb,zb:integer;
     i:char;
     vektorp,vektorpright,vektorpup,P:pole_v;{P=pozorovatel}
     dp,dright,dup,absp,abspright,abspup:real;

procedure d;
     begin
     dp:=-vektorp[1]*P[1]-vektorp[2]*P[2]-vektorp[3]*P[3];
     dright:=-vektorpright[1]*P[1]-vektorpright[2]*P[2]-vektorpright[3]*P[3];
     dup:=-vektorpup[1]*P[1]-vektorpup[2]*P[2]-vektorpup[3]*P[3];
     absp:=sqrt(vektorp[1]*vektorp[1]+vektorp[2]*vektorp[2]+vektorp[3]*vektorp[3]);
     abspright:=sqrt(vektorpright[1]*vektorpright[1]+vektorpright[2]*vektorpright[2]+vektorpright[3]*vektorpright[3]);
     abspup:=sqrt(vektorpup[1]*vektorpup[1]+vektorpup[2]*vektorpup[2]+vektorpup[3]*vektorpup[3]);
     end;

procedure longline(ax,ay,bx,by,l:integer);
     type pole=array[1..2] of integer;
     var u:pole;
     i:real;
     begin
     u[1]:=bx-ax;
     u[2]:=by-ay;
     i:=l/sqrt( sqr(u[1])+sqr(u[2]) );
     u[1]:=round(u[1]*i);
     u[2]:=round(u[2]*i);
     line(ax,ay,ax+u[1],ay+u[2]);
     end;
     {800-900}

procedure px3d(x,y,z:real);
     var i,lp,lpright,lpup:real;
     begin
     lp:=(vektorp[1]*x+vektorp[2]*y+vektorp[3]*z+dp)/(sqrt(absp));
     if lp>0 then begin

     lpright:=(vektorpright[1]*x+vektorpright[2]*y+vektorpright[3]*z+dright)/(sqrt(abspright));
     lpup:=(vektorpup[1]*x+vektorpup[2]*y+vektorpup[3]*z+dup)/(sqrt(abspup));

     i:=monitor/lp;
     line(round(i*lpright)+320,240-round(i*lpup),round(i*lpright)+320,240-round(i*lpup));
                  end;

     end;

procedure line3d(x,y,z,x2,y2,z2:real);
     var i,lpa,lprighta,lpupa,lp,lpright,lpup:real;
         a,b:integer;
         label skok;
     begin
     lpa:=(vektorp[1]*x+vektorp[2]*y+vektorp[3]*z+dp)/(sqrt(absp));
     lprighta:=(vektorpright[1]*x+vektorpright[2]*y+vektorpright[3]*z+dright)/(sqrt(abspright));
     lpupa:=(vektorpup[1]*x+vektorpup[2]*y+vektorpup[3]*z+dup)/(sqrt(abspup));

     lp:=(vektorp[1]*x2+vektorp[2]*y2+vektorp[3]*z2+dp)/(sqrt(absp));
     if lp<0 then if lpa<0 then goto skok;{!SKOK/JUMP}
     lpright:=(vektorpright[1]*x2+vektorpright[2]*y2+vektorpright[3]*z2+dright)/(sqrt(abspright));
     lpup:=(vektorpup[1]*x2+vektorpup[2]*y2+vektorpup[3]*z2+dup)/(sqrt(abspup));

     if lp>0 then if lpa>0 then begin
     {i:=monitor/lp;}
     a:=round((monitor/lpa)*lprighta)+320;
     b:=240-round((monitor/lpa)*lpupa);
     i:=monitor/lp;
     line(a,b,round(i*lpright)+320,240-round(i*lpup));
                                end;
     skok:;                               {!SKOK/JUMP}
     end;

begin
{-[]-}
gd:=detect;
InitGraph(gd, gm, 'c:/bp/bgi');
if GraphResult <> grOk then Halt(1);
{-[]-}
vektorp[1]:=0;
vektorp[2]:=1;
vektorp[3]:=0;
vektorpright[1]:=1;
vektorpright[2]:=0;
vektorpright[3]:=0;
vektorpup[1]:=0;
vektorpup[2]:=0;
vektorpup[3]:=1;
P[1]:=0;
P[2]:=0;
P[3]:=0;
monitor:=1280;

d;

repeat
clearviewport;

line3d(-5,5,-5,5,5,-5);
line3d(-5,5,5,5,5,5);
line3d(5,5,5,5,5,-5);
line3d(-5,5,5,-5,5,-5);
line3d(5,5,5,5,15,5);
line3d(5,5,-5,5,15,-5);
line3d(-5,5,-5,-5,15,-5);
line3d(-5,5,5,-5,15,5);
line3d(-5,15,-5,5,15,-5);
line3d(-5,15,5,5,15,5);
line3d(5,15,5,5,15,-5);
line3d(-5,15,5,-5,15,-5);

{ for xb:=-30 to 30 do begin
 for zb:=-30 to 30 do begin
 setcolor(15);
   line3d(xb/3,2,zb/3,xb/3,10,zb/3);

 end;
 end;   }


{->podmienkovy retazec pohybu pozorovatela}
i:=readkey;
case i of
#72: ;
#77: ;
#75: ;
#80: ;
#54:begin P[1]:=P[1]+1.3;end;{doprava/right}
#52:begin P[1]:=P[1]-1.3;end;{dolava/left}
#56:begin P[3]:=P[3]+1.3;end;{hore/up}
#50:begin P[3]:=P[3]-1.3;end;{dole/down}
#53,#43:begin P[2]:=P[2]+1.3 ;end;{priblizit/zoom in}
#49,#51,#55,#57,#45:begin P[2]:=P[2]-1.3;end;{oddialit/zoom out}
end;
d;
{->end}
until i=#27;
 CloseGraph;
end.
