
Есть програмка которая ресует изображения многогранника гексаэдра (перспектива 2 точки схода), вращающегося вокруг осей. Нужно реализовать закрашевание граней различными цветами.
" (Показать/Скрыть)
uses graph,crt;
type {описание типа вершины фигуры}
point=record
x0:real;{начальная абсцисса вершины}
y0:real;{начальная ордината вершины}
z0:real;{начальная апликата вершины}
x,y,z:real;{координаты вершины}
end;
figure3d=object {описание объекта трехмерной фигуры}
points:array[0..20] of point;{вершины фигуры}
ribs:array[0..20,0..20] of integer;{ребра фигуры}
x0,y0:integer;{координаты центра фигуры}
color:integer;{цвет фигуры}
pointcol:integer;{количество вершины фигуры}
constructor create(pc:integer);
procedure draw;{вывод фигуры на экран}
procedure rotatepointy(i:integer;fy:real);{поворот точки относительно оси ОУ}
procedure rotate(fx,fy,fz:real); {поворот фигуры на заданные углы}
end;
button=object {описание типа кнопки}
x1,y1,x2,y2:integer;{координаты верхнего левого и нижнего правого углов}
color,textcolor,selcolor,seltextcolor:integer;{цвет кнопки и ее текста}
caption:string;{название кнопки}
selected:boolean;{помечена кнопка или нет}
func:procedure;{процедура выполняемая при нажатии кнопки}
procedure draw;{рисование кнопки}
end;
menu=object{описание типа меню}
buttons:array[0..50] of button;{массив кнопок}
buttoncol:integer;{количество кнопок}
buttonnum:integer;{текущая (помеченная) кнопка}
exit:boolean; {выход}
procedure draw;{рисование меню}
procedure addbutton(butt:button);{добавление кнопки}
procedure delbutton(num:integer);{удаление кнопки}
procedure check(exitbutton:integer);{проверить какая кнопка нажата}
end;
constructor figure3d.create(pc:integer);{создание фигуры}
var
i,j:integer;
begin
pointcol:=pc;
color:=15;
x0:=350;
y0:=270;
for i:=0 to pointcol-1 do
for j:=0 to pointcol-1 do
ribs[i,j]:=0;
end;
procedure figure3d.draw;{рисование фигуры}
var
i,j:integer;
begin
setcolor(color);
for i:=0 to pointcol-1 do
putpixel(round(x0+points[i].x),round(y0-points[i].y),color);
{рисование вершин}
for i:=0 to pointcol-1 do
for j:=i+1 to pointcol-1 do
if ribs[i,j]=1 then
begin
{рисование ребер}
moveto(round(x0+points[i].x),round(y0-points[i].y));
lineto(round(x0+points[j].x),round(y0-points[j].y));
end;
end;
procedure figure3d.rotatepointy(i:integer;fy:real);{поворот вершины относительно оси ОУ}
var
x,y,z:real;
begin
x:=points[i].x;
y:=points[i].y;
z:=points[i].z;
points[i].x:=x*cos(fy)-z*sin(fy);
points[i].y:=y;
points[i].z:=x*sin(fy)+z*cos(fy);
end;
procedure figure3d.rotate(fx,fy,fz:real);{поворот фигуры на заданные углы}
var
i:integer;
begin
for i:=0 to pointcol-1 do
begin
points[i].x:=points[i].x0;
points[i].y:=points[i].y0;
points[i].z:=points[i].z0;
rotatepointy(i,fy);{поворот вершины относительно оси ОУ}
end;
end;
procedure button.draw;{рисование кнопки}
var
xc,yc:integer;
begin
if not selected then
begin
setfillstyle(1,color);
setcolor(textcolor);
end
else
begin
setfillstyle(1,selcolor);
setcolor(seltextcolor);
end;
bar(x1,y1,x2,y2);{рисование самой кнопки}
xc:=round((x2+x1)/2);
yc:=round((y2+y1)/2);
outtextxy(xc-4*length(caption),yc-4,caption);{вывод названия кнопки}
end;
procedure menu.addbutton(butt:button);{добавление кнопки}
begin
buttons[buttoncol]:=butt;
buttoncol:=buttoncol+1;
end;
procedure menu.delbutton(num:integer);{удаление кнопки}
var i:integer;
begin
for i:=num to buttoncol-2 do
buttons[i]:=buttons[i+1];
buttoncol:=buttoncol-1;
end;
procedure menu.draw;{рисование меню}
var
i:integer;
begin
for i:=0 to buttoncol-1 do
begin
if i=buttonnum then buttons[i].selected:=true else
buttons[i].selected:=false;
buttons[i].draw;{рисование кнопки}
end;
end;
procedure menu.check(exitbutton:integer);{какая кнопка нажата}
begin
case readkey of {считывание нажатой клавиши}
#13:if buttonnum=exitbutton then exit:=true else{Если нажат Ввод}
buttons[buttonnum].func;{То выполняется процедура выделенной кнопки}
#80:if buttonnum<buttoncol-1 then buttonnum:=buttonnum+1
else buttonnum:=0;{если нажата клавиша вниз}
#72:if buttonnum>0 then buttonnum:=buttonnum-1
else buttonnum:=buttoncol-1;{если нажата клавиша вверх}
end;
draw;{обновление меню}
end;
var{описание переменных}
i,j,gr,gd:integer;
figure:array[0..10] of figure3d;{массив фигур}
code,figurescol,figurenum:integer;
fx,fy,fz:real;{углы поворота фигур относительно осей координат}
dfx,dfy,dfz:real;{скорости поворота фигур относительно осей координат}
mainmenu:menu;{главное меню}
butt:button;{кнопка}
buff,buff1:string;{строчные переменные используемые в программе}
f:text;{указатель на текстовый файл}
procedure changefig;far;{процедура смены фигуры}
begin
setfillstyle(1,0);
bar(153,101,640,480);
figurenum:=mainmenu.buttonnum;
bar(210,10,500,18);
setcolor(3);
outtextxy(210,10,mainmenu.buttons[figurenum].caption);
end;
procedure pfx;far;{процедура увеличения скорости вращения относительно ОХ}
begin
dfx:=dfx+0.005;
end;
procedure mfx;far;{процедура уменьшения скорости вращения относительно ОХ}
begin
dfx:=dfx-0.005;
end;
procedure pfy;far;{процедура увеличения скорости вращения относительно ОУ}
begin
dfy:=dfy+0.005;
end;
procedure mfy;far;{процедура уменьшения скорости вращения относительно ОУ}
begin
dfy:=dfy-0.005;
end;
procedure pfz;far;{процедура увеличения скорости вращения относительно ОZ}
begin
dfz:=dfz+0.005;
end;
procedure mfz;far;{процедура уменьшения скорости вращения относительно ОZ}
begin
dfz:=dfz-0.005;
end;
procedure ex;far;{процедура выходя из программы}
begin
exit;
end;
begin
gd:=detect;
initgraph(gd,gd,'');{Инициализация графического режима}
mainmenu.buttoncol:=0;
mainmenu.exit:=false;
assign(f,'figures.dat');
reset(f);{открытие файла с данными о фигурах для чтения}
figurescol:=0;
figurenum:=0;
while not eof(f) do
begin
readln(f,buff);{считывание названия фигуры}
{задание атрибутов кнопки соответствующих фигуре}
butt.caption:=buff;
butt.x1:=10;
butt.x2:=100;
butt.y1:=10*figurescol+1;
butt.y2:=10*figurescol+10;
butt.color:=0;
butt.selcolor:=1;
butt.textcolor:=14;
butt.seltextcolor:=15;
butt.func:=changefig;
mainmenu.addbutton(butt);
readln(f,buff);{считывание количества вершин фигуры}
val(buff,figure[figurescol].pointcol,code);
figure[figurescol].create(figure[figurescol].pointcol);
{*****************}
for i:=0 to figure[figurescol].pointcol-1 do
begin
readln(f,buff);{считывание координат вершин фигуры}
{присваивание координат вершин фигуры}
buff1:=copy(buff,0,pos(',',buff)-1);
val(buff1,figure[figurescol].points[i].x0,code);
buff:=copy(buff,pos(',',buff)+1,length(buff)-pos(',',buff));
buff1:=copy(buff,0,pos(',',buff)-1);
val(buff1,figure[figurescol].points[i].y0,code);
buff:=copy(buff,pos(',',buff)+1,length(buff)-pos(',',buff));
buff1:=buff;
val(buff1,figure[figurescol].points[i].z0,code);
end;
for i:=0 to figure[figurescol].pointcol-1 do
begin
readln(f,buff);{считывание информации о ребрах фигуры }
for j:=0 to figure[figurescol].pointcol-2 do
begin
buff1:=copy(buff,0,pos(',',buff)-1);
val(buff1,figure[figurescol].ribs[i,j],code);
buff:=copy(buff,pos(',',buff)+1,length(buff)-pos(',',buff));
end;
val(buff,figure[figurescol].ribs[i,j+1],code);
end;
figurescol:=figurescol+1;
end;
close(f);
{инициализация кнопок меню}
{**********}
butt.caption:='+Скорость FX';
butt.x1:=10;
butt.x2:=100;
butt.y1:=(figurescol)*10+1;
butt.y2:=(figurescol)*10+10;
butt.selcolor:=1;
butt.seltextcolor:=15;
butt.color:=0;
butt.textcolor:=14;
butt.selected:=false;
butt.func:=pfx;
mainmenu.addbutton(butt);
{***********}
butt.caption:='-Скорость FX';
butt.x1:=10;
butt.x2:=100;
butt.y1:=(figurescol+1)*10+1;
butt.y2:=(figurescol+1)*10+10;
butt.selcolor:=1;
butt.seltextcolor:=15;
butt.color:=0;
butt.textcolor:=14;
butt.selected:=false;
butt.func:=mfx;
mainmenu.addbutton(butt);
{**********}
butt.caption:='+Скорость FY';
butt.x1:=10;
butt.x2:=100;
butt.y1:=(figurescol+2)*10+1;
butt.y2:=(figurescol+2)*10+10;
butt.selcolor:=1;
butt.seltextcolor:=15;
butt.color:=0;
butt.textcolor:=14;
butt.selected:=false;
butt.func:=pfy;
mainmenu.addbutton(butt);
{***********}
butt.caption:='-Скорость FY';
butt.x1:=10;
butt.x2:=100;
butt.y1:=(figurescol+3)*10+1;
butt.y2:=(figurescol+3)*10+10;
butt.selcolor:=1;
butt.seltextcolor:=15;
butt.color:=0;
butt.textcolor:=14;
butt.selected:=false;
butt.func:=mfy;
mainmenu.addbutton(butt);
{**********}
butt.caption:='+Скорость FZ';
butt.x1:=10;
butt.x2:=100;
butt.y1:=(figurescol+4)*10+1;
butt.y2:=(figurescol+4)*10+10;
butt.selcolor:=1;
butt.seltextcolor:=15;
butt.color:=0;
butt.textcolor:=14;
butt.selected:=false;
butt.func:=pfz;
mainmenu.addbutton(butt);
{***********}
butt.caption:='-Скорость FZ';
butt.x1:=10;
butt.x2:=100;
butt.y1:=(figurescol+5)*10+1;
butt.y2:=(figurescol+5)*10+10;
butt.selcolor:=1;
butt.seltextcolor:=15;
butt.color:=0;
butt.textcolor:=14;
butt.selected:=false;
butt.func:=mfz;
mainmenu.addbutton(butt);
{***********}
butt.caption:='Выход';
butt.x1:=10;
butt.x2:=100;
butt.y1:=(figurescol+6)*10+1;
butt.y2:=(figurescol+6)*10+10;
butt.selcolor:=1;
butt.seltextcolor:=15;
butt.color:=0;
butt.textcolor:=14;
butt.selected:=false;
butt.func:=ex;
mainmenu.addbutton(butt);
mainmenu.buttonnum:=0;
{задание начальных значений}
fx:=0;
fy:=0;
fz:=0;
dfx:=0.01;
dfy:=0.01;
dfz:=0.01;
{рисование панелей}
setcolor(2);
rectangle(152,0,639,100);
rectangle(0,0,152,479);
{вывод текстового интерфейса}
outtextxy(154,10,'Фигура:');
outtextxy(154,20,'Угол поворота относительно оси ОХ (FX):');
outtextxy(154,30,'Угол поворота относительно оси ОY (FY):');
outtextxy(154,40,'Угол поворота относительно оси ОZ (FZ):');
outtextxy(154,50,'Скорость изменения FX:');
outtextxy(154,60,'Скорость изменения FY:');
outtextxy(154,70,'Скорость изменения FZ:');
setcolor(3);
{вывод название текущей фигуры}
outtextxy(210,10,mainmenu.buttons[figurenum].caption);
{вывод текущей углов поворота}
str(fx:2:2,buff);
outtextxy(480,20,buff);
str(fy:2:2,buff);
outtextxy(480,30,buff);
str(fz:2:2,buff);
outtextxy(480,40,buff);
{вывод текущей скоростей поворота}
str(dfx:2:2,buff);
outtextxy(380,50,buff);
str(dfy:2:2,buff);
outtextxy(380,60,buff);
str(dfz:2:2,buff);
outtextxy(380,70,buff);
mainmenu.draw;
figurenum:=0;
while not mainmenu.exit do{организация цикла}
begin
if keypressed then mainmenu.check(figurescol+6);{если нажата клавиша, то проверить какая}
{стирание старой фигуры}
figure[figurenum].color:=0;
figure[figurenum].draw;
{поворот фигуры}
fx:=fx+dfx;
fy:=fy+dfy;
fz:=fz+dfz;
if fx>6.3 then fx:=fx-6.28;
if fy>6.3 then fy:=fy-6.28;
if fz>6.3 then fz:=fz-6.28;
if fx<0 then fx:=fx+6.28;
if fy<0 then fy:=fy+6.28;
if fz<0 then fz:=fz+6.28;
figure[figurenum].rotate(fx,fy,fz);
{рисование новой фигуры}
figure[figurenum].color:=15;
figure[figurenum].draw;
setcolor(3);
{вывод названия текущей фигуры}
outtextxy(210,10,mainmenu.buttons[figurenum].caption);
{вывод текущей углов поворота}
setfillstyle(1,0);
bar(480,20,638,49);
str(fx:3:3,buff);
outtextxy(480,20,buff);
str(fy:3:3,buff);
outtextxy(480,30,buff);
str(fz:3:3,buff);
outtextxy(480,40,buff);
bar(380,50,638,79);
{вывод текущей скоростей поворота}
str(dfx:3:3,buff);
outtextxy(380,50,buff);
str(dfy:3:3,buff);
outtextxy(380,60,buff);
str(dfz:3:3,buff);
outtextxy(380,70,buff);
delay(100);
end;
exit;
end.