Viwwna

Junior Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Здравствуйте, не могу добиться корректного вращения фигуры вокруг осей (Поворота вокруг осей). Что именно делаю не так? Заранее спасибо. Код: uses Graph,crt; {объявляю константы} const coord: array[0..5,0..2] of real = {матрица координат вершин октаэдра} ((0,0,0), (160,30,30), (80,60,30), (80,0,30), (80,30,60), (80,30,0)); side: array[0..11,0..1] of integer = {матрица ребер октаэдра } ((0,1),(0,4),(0,2),(1,3),(1,5),(2,3),(2,6),(3,7),(4,5),(4,6),(5,7),(6,7)); f:real=45*Pi/180; {угол поворота вокруг оси OX} q:real=35.26*Pi/180; {угол поворота вокруг оси OY} {объявляю переменные} var corner :real; {угол поворота вокруг произвольной оси} sx,sy,sx1,sy1,p,gd,gm,i: integer; {вспомогательные переменные} ch:char; {код нажатой клавиши} tX,tY,tZ:real; {вспомогательные переменные} coordPr: array[0..5,0..2] of real; {матрица изометрических координат} {процедура нахождения изометрических координат октаэдра } Procedure Proek; Begin for p:=0 to 5 do {цикл от 0 до 5} begin coordPr[p,0]:=coord[p,0]*cos(f)+coord[p,2]*sin(f); coordPr[p,2]:=0; coordPr[p,1]:=coord[p,0]*sin(f)*sin(q)+coord[p,1]*cos(q)-coord[p,2]*cos(f)*sin(q); end; End; {процедура рисования контура октаэдра } procedure draw(color:byte); begin {в цикле от 0 до 11 соединяем точки вершин октаэдра по номерам ребер. Точки строим относительно центра экрана} for p:=0 to 11 do begin sx:=round(coordPr[side[p,0],0]+getmaxx div 2); sx1:=round(coordPr[side[p,1],0]+getmaxx div 2); sy:=round(getmaxy div 2-coordPr[side[p,0],1]); sy1:=round(getmaxy div 2-coordPr[side[p,1],1]); setcolor(color); {задаем цвет} line(SX,SY,sx1,sy1); {проводим линии ребер} end; end; {процедура поворота вокруг оси OZ} procedure rotateOZ; begin for i:=0 to 5 do begin {в цикле находим новые координаты октаэдра } tX := coord[i,0] * COS(corner) - coord[i,1] * SIN(corner); tY := coord[i,0] * SIN(corner) + coord[i,1] * COS(corner); coord[i,0]:=tX; coord[i,1] :=tY; end; end; {процедура поворота вокруг оси OX} procedure rotateOX; begin for i:=0 to 5 do begin {в цикле находим новые координаты октаэдра } tY := coord[i,1] * COS(corner) - coord[i,2] * SIN(corner); tZ := coord[i,1] * SIN(corner) + coord[i,2] * COS(corner); coord[i,1]:=tY; coord[i,2] :=tZ; end; end; { процедура поворота вокруг оси OY} procedure rotateOY; begin for i:=0 to 5 do begin {в цикле находим новые координаты октаэдра } tX := coord[i,0] * COS(corner) + coord[i,2] * SIN(corner); tZ := -coord[i,0] * SIN(corner) + coord[i,2] * COS(corner); coord[i,0]:=tX; coord[i,2] :=tZ; end; end; {процедура рисования изометрических осей} procedure Axes; var l:integer; begin SetColor(2); {устанавливаю цвет} l:=GetMaxY div 2; {рисуем ось OY вертикально вверх} line(GetMaxX div 2,GetMaxY div 2,GetMaxX div 2,0); {рисуем ось OX под углом 120 с оси OY} line(GetMaxX div 2,GetMaxY div 2,GetMaxX div 2 + round(0.866*l),GetMaxY div 2 + round(0.5*l)); {рисуем ось OX под углом -1200 с оси OY} line(GetMaxX div 2,GetMaxY div 2,GetMaxX div 2 - round(0.866*l),GetMaxY div 2 + round(0.5*l)); end; {основная программа} begin gm:=VgaHi; {определяю графический режим} gd:=detect; {определяю графический драйвер} initgraph(gd,gm,'c:\TP7\BGI'); {инициалиализирую графику } corner := 0.05; {задаю угол поворота } {надписи осей} OutTextXY(getmaxx div 2 + 10,10,'Y'); OutTextXY(GetMaxX div 2 + round(0.866*(GetMaxY div 2)) + 10,GetMaxY div 2 + round(0.5*(GetMaxY div 2))-10,'Z'); OutTextXY(GetMaxX div 2 - round(0.866*(GetMaxY div 2))-10,GetMaxY div 2 + round(0.5*(GetMaxY div 2))-10,'X'); Axes; {вызываю процедуру Axes} Proek; {вызываю процедуру Proek} draw(15); {вызываю процедуру draw (цвет белый)} repeat {цикл с постусловием} ch:=readkey; {запоминаю код нажатой клавиши} case ch of {оператор выбора} #49:begin {если нажата <1>} Repeat {выполнять, пока не нажат <enter>} Axes; {вызываю процедуру Axes} Proek; {вызываю процедуру Proek} draw(15); {вызываю процедуру draw (цвет белый)} delay(5000); {задержка 5000 мс} draw(0); {вызываю процедуру draw (цвет экрана)} rotateOX; {вызов процедуры rotateOX} {если нажата любая клавиша, то выход их цикла} if keypressed then break; until ch=#27; end; #50:begin {если нажата <2>} Repeat {выполнять, пока не нажат <enter>} Axes; {вызываю процедуру Axes} Proek; {вызываю процедуру Proek} draw(15); {вызываю процедуру draw (цвет белый)} delay(5000); {задержка 5000 мс} draw(0); {вызываю процедуру draw (цвет экрана)} rotateOY; {вызов процедуры rotateOY} {если нажата любая клавиша, то выход их цикла} if keypressed then break; until ch=#27; end; #51:begin {если нажата <3>} Repeat {выполнять, пока не нажат <enter>} Axes; {вызываю процедуру Axes} Proek; {вызываю процедуру Proek} draw(15); {вызываю процедуру draw (цвет белый)} delay(5000); {задержка 5000 мс} draw(0); {вызываю процедуру draw (цвет экрана)} rotateOZ; {вызов процедуры rotateOZ} {если нажата любая клавиша, то выход их цикла} if keypressed then break; until ch=#27; end; #52:begin {если нажата <4>} Repeat {выполнять, пока не нажат <enter>} Axes; {вызываю процедуру Axes} Proek; {вызываю процедуру Proek} draw(15); {вызываю процедуру draw (цвет белый)} delay(50000); {задержка 50000 мс} draw(0); {вызываю процедуру draw (цвет экрана)} {увеличение масштаба по оси X} for p:=0 to 3 do coord[p,0]:=coord[p,0]*3; Proek; {вызываю процедуру Proek} draw(15); {вызываю процедуру draw (цвет белый)} delay(50000); {задержка 50000 мс} draw(0); {вызываю процедуру draw (цвет экрана)} {уменьшение масштаба по оси X} for p:=0 to 3 do coord[p,0]:=coord[p,0]/3; {если нажата любая клавиша, то выход их цикла} if keypressed then break until ch=#27; end; #53:begin {если нажата <5>} Repeat {выполнять, пока не нажат <enter>} Axes; {вызываю процедуру Axes} Proek; {вызываю процедуру Proek} draw(15); {вызываю процедуру draw (цвет белый)} delay(50000); {задержка 50000 мс} draw(0); {вызываю процедуру draw (цвет экрана)} {увеличение масштаба по оси Y} for p:=0 to 5 do coord[p,1]:=coord[p,1]*2; Proek; {вызываю процедуру Proek} draw(15); {вызываю процедуру draw (цвет белый)} delay(50000); {задержка 50000 мс} draw(0); {вызываю процедуру draw (цвет экрана)} { уменьшение масштаба по оси Y} for p:=0 to 5 do coord[p,1]:=coord[p,1]/2; {если нажата любая клавиша, то выход их цикла} if keypressed then break until ch=#27; end; #54:begin {если нажата <6>} Repeat {выполнять, пока не нажат <enter>} Axes; {вызываю процедуру Axes} Proek; {вызываю процедуру Proek} draw(15); {вызываю процедуру draw (цвет белый)} delay(50000); {задержка 50000 мс} draw(0); {вызываю процедуру draw (цвет экрана)} {увеличение масштаба по оси Z} for p:=0 to 5 do coord[p,2]:=coord[p,2]*3; Proek; {вызываю процедуру Proek} draw(15); {вызываю процедуру draw (цвет белый)} delay(50000); {задержка 50000 мс} draw(0); {вызываю процедуру draw (цвет экрана)} {уменьшение масштаба по оси Z} for p:=0 to 5 do coord[p,2]:=coord[p,2]/3; {если нажата любая клавиша, то выход их цикла} if keypressed then break until ch=#27; end; #55:begin {если нажата <7>} Repeat {выполнять, пока не нажат <enter>} Axes; {вызываю процедуру Axes} Proek; {вызываю процедуру Proek} draw(15); {вызываю процедуру draw (цвет белый)} delay(50000); {задержка 50000 мс} draw(0); {вызываю процедуру draw (цвет экрана)} {увеличение масштаба по трем осям } for p:=0 to 5 do begin coord[p,0]:=coord[p,0]/2; coord[p,1]:=coord[p,1]/2; coord[p,2]:=coord[p,2]/2; end; Proek; {вызываю процедуру Proek} draw(15); {вызываю процедуру draw (цвет белый)} delay(50000); {задержка 50000 мс} draw(0); {вызываю процедуру draw (цвет экрана)} {уменьшение масштаба по трем осям} for p:=0 to 5 do begin coord[p,0]:=coord[p,0]*2; coord[p,1]:=coord[p,1]*2; coord[p,2]:=coord[p,2]*2; end; {если нажата любая клавиша, то выход их цикла} if keypressed then break until ch=#27; end; end; until ch=#13; closegraph; {закрываем графический режим} end. |
| Всего записей: 62 | Зарегистр. 18-11-2011 | Отправлено: 19:01 18-05-2012 | Исправлено: Viwwna, 19:04 18-05-2012 |
|