{$n+} program piram; uses graph,crt; type {Тип - точка} TPoint = record X, Y, Z: double; end; var centerX, centerY: integer; {координаты центра экрана} {рисуем оси координат} procedure Axis(Color: integer); var a:integer; begin cleardevice; setcolor(Color); SetLineStyle(Dashedln,0,NormWidth); outtextxy(50,40,'help - H'); outtextxy(50,50,'exit - ESC'); a:=240+round(220/sqrt(3)); line(320,240,540,a); {x} line(540,a,535,a-5); line(540,a,533,a-1); outtextxy(537,a+3,'x'); line(320,240,100,a); {y} line(106,a,100,a-1); line(104,a-5,100,a); outtextxy(102,a+1,'y'); line(320,240,320,20); {Z} line(320,20,317,27); line(320,20,323,27); outtextxy(310,20,'z'); outtextxy(320-9,240-7,'0');{0} end; procedure help; begin ClearDevice; {очистка графического окна} setcolor(blue); {установка цвета} rectangle(150,20,490,400); {вычерчивание прямоугольника с координатами верхнего левого и правого нижнего углов соответственно} outtextxy(305,10,' help '); {вывод текстовой строки} outtextxy(170,40,'e - povorot vpravo vokrug osi X'); outtextxy(170,60,'r - povorot vlevo vokrug osi X'); outtextxy(170,80,'d - povorot vpravo vokrug osi Y'); outtextxy(170,100,'f - povorot vlevo vokrug osi Y'); outtextxy(170,120,'c - povorot vpravo vokrug osi Z'); outtextxy(170,140,'v - povorot vlevo vokrug osi Z'); outtextxy(170,180,'w - peremeshenie vpered vdol osi X'); outtextxy(170,200,'q - peremeshenie nazad vdol osi X'); outtextxy(170,220,'a - peremeshenie vpered vdol osi Y'); outtextxy(170,240,'s - peremeshenie nazad vdol osi Y'); outtextxy(170,260,'z - peremeshenie vpered vdol osi Z'); outtextxy(170,280,'x - peremeshenie nazad vdol osi Z'); outtextxy(170,320,'plus - uvelichenie razmera'); outtextxy(170,340,'minus - umenshenie razmera'); readkey; ClearDevice; end; {функции перевода из 3d в 2d} function CoordX(P: TPoint): integer; begin CoordX:=Trunc(centerX+(cos(pi/6)*(P.Y-P.X))); end; function CoordY(P: TPoint): integer; begin CoordY:=Trunc(centerY-(P.Z-sin(pi/6)*(P.X+P.Y))); end; {Процедура построения пирамиды} procedure Pyramide(RBig,RSmall,H,N:integer;F:real;color:integer;p0:TPoint); var i:integer; p1,p2,p3,p4:TPoint; fi0:real; begin fi0:=F; SetLineStyle(SolidLn,0,NormWidth); SetColor(color); for i:=1 to N do begin if (i=n) then begin p2.X:=p0.X+RBig*cos(2*pi/N+fi0); p2.Y:=p0.Y+RBig*sin(2*pi/N+fi0);; p2.Z:=p0.Z; p4.X:=p0.X+RSmall*cos(2*pi/N+fi0); p4.Y:=p0.Y+RSmall*sin(2*pi/N+fi0);; p4.Z:=p0.Z+H; end else begin p2.X:=p0.X+RBig*cos(2*pi/N*(i+1)+fi0); p2.Y:=p0.Y+RBig*sin(2*pi/N*(i+1)+fi0);; p2.Z:=p0.Z; p4.X:=p0.X+RSmall*cos(2*pi/N*(i+1)+fi0); p4.Y:=p0.Y+RSmall*sin(2*pi/N*(i+1)+fi0);; p4.Z:=p0.Z+H; end; p1.X:=p0.X+RBig*cos(2*pi/N*i+fi0); p1.Y:=p0.Y+RBig*sin(2*pi/N*i+fi0);; p1.Z:=p0.Z; p3.X:=p0.X+RSmall*cos(2*pi/N*i+fi0); p3.Y:=p0.Y+RSmall*sin(2*pi/N*i+fi0);; p3.Z:=p0.Z+H; Line(CoordX(p1),CoordY(p1),CoordX(p2),CoordY(p2)); Line(CoordX(p3),CoordY(p3),CoordX(p4),CoordY(p4)); Line(CoordX(p1),CoordY(p1),CoordX(p3),CoordY(p3)); end; end; var Gd, Gm : Integer; ver:integer; {количество вершин пирамиды} p:TPoint; ch:char; {нажатая на клавиатуре кнопка} rPyrBig, {радиус нижнего основания пирамиды} rPyrSmall,{радиус верхнего основания пирамиды} hPyr:integer; {высота пирамиды} fi:real; begin writeln('Введите количество вершин пирамиды (22)and(ver<50); p.X:=0; p.Y:=0; p.Z:=0; rPyrBig:=75; rPyrSmall:=25; hPyr:=125; fi:=0; Gd:= Detect; InitGraph(Gd, Gm, ''); if GraphResult <> grOk then Halt; centerX := GetMaxX div 2; centerY := GetMaxY div 2; Axis(Red); Pyramide(rPyrBig, rPyrSmall, hPyr, ver,fi,Green,p); repeat ch:=UpCase(readkey); case ch of 'H': {нажатa H} help; {Перемещение по осям координат} 'Q': {нажатa Q} p.Y:=p.Y-1; 'W': {нажатa W} p.Y:=p.Y+1; 'A': {нажатa A} p.X:=p.X+1; 'S': {нажатa S} p.X:=p.X-1; 'Z': {нажатa Z} p.Z:=p.Z+1; 'X': {нажатa X} p.Z:=p.Z-1; {Увеличение - уменьшение размера} '+': {нажатa +} begin rPyrBig := rPyrBig+1; rPyrSmall := rPyrSmall+1; hPyr := hPyr+1; end; '-': {нажатa -} begin rPyrBig := rPyrBig-1; rPyrSmall := rPyrSmall-1; hPyr := hPyr-1; end; {Повороты относительно осей} {oZ} 'C': {нажатa C} fi:=fi+(2*Pi)/360; 'V': {нажатa V} fi:=fi-(2*Pi)/360; {oX} 'E': {нажатa E} ; 'R': {нажатa R} ; {oY} 'D': {нажатa D} ; 'F': {нажатa F} ; end; Axis(Red); Pyramide(rPyrBig, rPyrSmall, hPyr, ver,fi,Green,p); until (Ord(Ch)=27)or(Ord(Ch)=13); {цикл до тех пор пока не нажата клавиша Enter либо Esc} CloseGraph; end.