grayhex
Newbie | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору PROGRAM lab5; uses graph,crt; const n=8; type v=array [1..4] of real;mat=array [1..4,1..4] of real; matob=array [1..n] of v; const t:matob=((200,200,200,1),(300,200,200,1),(300,300,200,1),(200,300,200,1), (200,200,100,1),(300,200,100,1),(300,300,100,1),(200,300,100,1)); m:mat=((1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1)); e:mat=((1,0,0,0),(0,1,0,0),(0.35,-0.35,0,0),(0,0,0,1)); var mm:mat;pt:matob;i:byte;dr,reg,u:integer;smx,smy,x,y:real; procedure draw(ot:matob;cv:byte); var i:byte; procedure lin(oo:matob;p,q:byte); begin line(trunc(oo[p,1]),trunc(oo[p,2]),trunc(oo[q,1]),trunc(oo[q,2])); end; begin setcolor(cv); for i:=1 to n div 2-1 do lin(ot,i,i+1); lin(ot,1,4); for i:=n div 2+1 to n-1 do lin(ot,i,i+1); lin(ot,n div 2+1,n); for i:=1 to 4 do lin(ot,i,i+4); end; procedure mult(a:v;b:mat;var pv:v); var i,j:byte; begin for j:=1 to 4 do begin pv[j]:=0;for i:=1 to 4 do pv[j]:=pv[j]+a[i]*b[i,j] end; if pv[4]<>1 then for i:=1 to 4 do pv[i]:=pv[i]/pv[4] end; procedure povorot(ugol:integer); var p:real; begin p:=ugol*2*pi/360; m[2,2]:=cos(p);m[2,3]:=sin(p);m[3,2]:=-sin(p);m[3,3]:=cos(p) end; procedure sme(sx,sy,sz:real); begin for i:=1 to n do begin t[i,1]:=t[i,1]+sx;t[i,2]:=t[i,2]+sy;t[i,3]:=t[i,3]+sz end end; procedure mas(mx,my,mz:real); begin m[1,1]:=mx;m[2,2]:=my;m[3,3]:=mz end; begin dr:=detect; initgraph(dr,reg,'') ; setbkcolor(15); for i:=1 to n do mult(t[i],e,pt[i]); draw(pt,red); readln; repeat sme(-200,-300,-200); povorot(2); for i:=1 to n do mult(t[i],m,t[i]); sme(200,300,200); for i:=1 to n do mult(t[i],e,pt[i]); draw(pt,blue); delay(10000); cleardevice; until keypressed; closegraph; end. |