unit kujundid; interface uses graph, crt; const grtegur=270.0; type punkt=record x, y, z: real; end; tahukas=object nurk:array[1..8] of punkt; procedure loo_kuup(serv: real); procedure keera(xz, yz, xy:real); procedure joonista(x, y: integer); procedure joonista_perspektiiviga(x, y: integer; lx, ly, lz: real); procedure joonista_nihkega(x, y: integer; lx, ly, lz: real); procedure joonista_keeratult(keskx, kesky:integer; xz, yz, xy: real); end; implementation procedure tahukas.loo_kuup(serv: real); var poolserv: real; i: integer; begin poolserv:=serv/2; nurk[1].x:=-poolserv; nurk[2].x:=poolserv; nurk[3].x:=poolserv; nurk[4].x:=-poolserv; nurk[5].x:=-poolserv; nurk[6].x:=poolserv; nurk[7].x:=poolserv; nurk[8].x:=-poolserv; nurk[1].z:=poolserv; nurk[2].z:=poolserv; nurk[3].z:=-poolserv; nurk[4].z:=-poolserv; nurk[5].z:=poolserv; nurk[6].z:=poolserv; nurk[7].z:=-poolserv; nurk[8].z:=-poolserv; for i:=1 to 4 do nurk[i].y:=-poolserv; for i:=5 to 8 do nurk[i].y:=poolserv; end; procedure tahukas.keera(xz, yz, xy: real); var i: integer; abi:real; begin for i:=1 to 8 do begin abi:=nurk[i].x; nurk[i].x:=nurk[i].x*cos(xz)-nurk[i].z*sin(xz); nurk[i].z:=abi*sin(xz)+nurk[i].z*cos(xz); end; for i:=1 to 8 do begin abi:=nurk[i].y; nurk[i].y:=nurk[i].y*cos(yz)-nurk[i].z*sin(yz); nurk[i].z:=abi*sin(yz)+nurk[i].z*cos(yz); end; for i:=1 to 8 do begin abi:=nurk[i].x; nurk[i].x:=nurk[i].x*cos(xy)-nurk[i].y*sin(xy); nurk[i].y:=abi*sin(xy)+nurk[i].y*cos(xy); end; end; procedure tahukas.joonista(x, y: integer); var i: integer; begin for i:=1 to 3 do line(x+round(nurk[i].x), y+round(nurk[i].y), x+round(nurk[i+1].x), y+round(nurk[i+1].y)); line(x+round(nurk[4].x), y+round(nurk[4].y), x+round(nurk[1].x), y+round(nurk[1].y)); for i:=5 to 7 do line(x+round(nurk[i].x), y+round(nurk[i].y), x+round(nurk[i+1].x), y+round(nurk[i+1].y)); line(x+round(nurk[8].x), y+round(nurk[8].y), x+round(nurk[5].x), y+round(nurk[5].y)); for i:=1 to 4 do line(x+round(nurk[i].x), y+round(nurk[i].y), x+round(nurk[i+4].x), y+round(nurk[i+4].y)); end; procedure tahukas.joonista_perspektiiviga(x, y: integer; lx, ly, lz: real); function ax(p: punkt):integer; begin ax:=round(((p.x+lx)*grtegur)/(p.z+lz)); end; function ay(p: punkt):integer; begin ay:=round(((p.y-ly)*grtegur)/(p.z+lz)); end; var i: integer; begin for i:=1 to 3 do line(x+ax(nurk[i]), y-ay(nurk[i]), x+ax(nurk[i+1]), y-ay(nurk[i+1])); line(x+ax(nurk[4]), y-ay(nurk[4]), x+ax(nurk[1]), y-ay(nurk[1])); for i:=5 to 7 do line(x+ax(nurk[i]), y-ay(nurk[i]), x+ax(nurk[i+1]), y-ay(nurk[i+1])); line(x+ax(nurk[8]), y-ay(nurk[8]), x+ax(nurk[5]), y-ay(nurk[5])); for i:=1 to 4 do line(x+ax(nurk[i]), y-ay(nurk[i]), x+ax(nurk[i+4]), y-ay(nurk[i+4])); end; procedure tahukas.joonista_nihkega(x, y: integer; lx, ly, lz: real); function ax(p: punkt):integer; begin ax:=round((p.x+lx)+(p.z+lz)/2); end; function ay(p: punkt):integer; begin ay:=round((p.y-ly)+(p.z+lz)/2); end; var i: integer; begin for i:=1 to 3 do line(x+ax(nurk[i]), y-ay(nurk[i]), x+ax(nurk[i+1]), y-ay(nurk[i+1])); line(x+ax(nurk[4]), y-ay(nurk[4]), x+ax(nurk[1]), y-ay(nurk[1])); for i:=5 to 7 do line(x+ax(nurk[i]), y-ay(nurk[i]), x+ax(nurk[i+1]), y-ay(nurk[i+1])); line(x+ax(nurk[8]), y-ay(nurk[8]), x+ax(nurk[5]), y-ay(nurk[5])); for i:=1 to 4 do line(x+ax(nurk[i]), y-ay(nurk[i]), x+ax(nurk[i+4]), y-ay(nurk[i+4])); end; procedure tahukas.joonista_keeratult(keskx, kesky: integer; xz, yz, xy: real); var abitahukas: tahukas; begin abitahukas:=self; abitahukas.keera(xz, yz, xy); abitahukas.joonista(keskx, kesky); end; end.