1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Помогите плиз! Есть програмка которая ресует изображения многогранника гексаэдра (перспектива 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.