Viwwna
Junior Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Не получается применить к осям аналогичные преобразования, что и к фигуре. Но в любом случае выкладываю код! dimitriy7, я даже не знала о {$N+,E-,G+}! akaGM, спасибо, про перенос поняла... Код: {$N+,E-,G+} PROGRAM Task3_Geksaidr; USES Crt, Graph; CONST UgolX=Pi/12; {Угол вращения вокруг оси X} UgolY=pi/12; {Угол вращения вокруг оси Y} VAR Gd, Gm: Integer; {Переменные для работы в графическом режиме} hex: array[1..8, 1..3] of single; {Массив с координатами вершин} hex2: array[1..8, 1..3] of integer; {Массив с координатами вершин в проекции} grani: array[1..6, 1..4] of integer; {Массив граней гексаэдра} ch: char; {Значение нажатой клавиши} i, j: integer; {Цикловые переменные} {=============================} PROCEDURE Projectiya; {Расчет координат проекции} VAR i, j: integer; {Цикловые переменные} BEGIN For i:=1 To 8 Do Begin hex2[i,1]:=trunc(hex[i,1]*cos(UgolY)+ hex[1,3]*sin(UgolY)+320); hex2[i,2]:=200-trunc(hex[i,1]*sin(UgolY)*sin(UgolX)+hex[i,2]*cos(UgolX)-hex[i,3]*cos(UgolY)*sin(UgolX)); End; END; procedure Axis; var l:integer; begin SetColor(15); {устанавливаю цвет} l:=GetMaxY div 2; line(GetMaxX div 2,GetMaxY div 2,GetMaxX div 2,0); {рисуем ось OY} line(GetMaxX div 2,GetMaxY div 2,135,GetMaxY div 2); {рисуем ось OX} line(GetMaxX div 2,GetMaxY div 2,GetMaxX,GetMaxY); {рисуем ось OZ} end; {=============================} FUNCTION VidimayaGran(i:integer): boolean; {Определение видимости i-й грани} VAR V1,V2,N: array[1..3] of single; scalar: single; BEGIN {Расчет значений 2-х векторов, лежащих в плоскости грани} For j:=1 To 2 Do Begin V1[j]:=hex2[grani[i,2],j]-hex2[grani[i,1],j]; V2[j]:=hex2[grani[i,3],j]-hex2[grani[i,1],j]; End; {Вычисление вектора нормали грани} N[3]:=V1[1]*V2[2]-V2[1]*V1[2]; VidimayaGran:=(N[3]>0); END; {=============================} PROCEDURE Draw; {Вывод на экран} VAR gran: array[1..4] of PointType; BEGIN Projectiya; For i:=1 To 6 Do Begin If VidimayaGran(i) Then Begin {Если грань видима, то выводим ее на экран} For j:=1 To 4 Do Begin gran[j].x:=hex2[grani[i,j],1]; gran[j].y:=hex2[grani[i,j],2]; End; SetFillStyle(1,i+8); {Устанавливаем цвет и стиль закраски} FillPoly(4,gran); End; End; END; {=============================} PROCEDURE VrachOY(Ugol: real); {Поворот вокруг оси OY} VAR x,z: single; BEGIN For i:=1 To 8 Do Begin x:=hex[i,1]; z:=hex[i,3]; hex[i,1]:=x*cos(Ugol)+z*sin(Ugol); hex[i,3]:=-x*sin(Ugol)+z*cos(Ugol); End; END; {=============================} BEGIN {Описываем гексаэдр} hex[1,1]:=30; hex[1,2]:=0; hex[1,3]:=0; hex[2,1]:=30; hex[2,2]:=150; hex[2,3]:=0; hex[3,1]:=180; hex[3,2]:=150; hex[3,3]:=0; hex[4,1]:=180; hex[4,2]:=0; hex[4,3]:=0; hex[5,1]:=30; hex[5,2]:=0; hex[5,3]:=150; hex[6,1]:=30; hex[6,2]:=150; hex[6,3]:=150; hex[7,1]:=180; hex[7,2]:=150; hex[7,3]:=150; hex[8,1]:=180; hex[8,2]:=0; hex[8,3]:=150; {и грани} grani[1,1]:=1; grani[1,2]:=2; grani[1,3]:=3; grani[1,4]:=4; grani[2,1]:=5; grani[2,2]:=6; grani[2,3]:=2; grani[2,4]:=1; grani[3,1]:=2; grani[3,2]:=6; grani[3,3]:=7; grani[3,4]:=3; grani[4,1]:=4; grani[4,2]:=3; grani[4,3]:=7; grani[4,4]:=8; grani[5,1]:=1; grani[5,2]:=4; grani[5,3]:=8; grani[5,4]:=5; grani[6,1]:=5; grani[6,2]:=8; grani[6,3]:=7; grani[6,4]:=6; Gd := Detect; InitGraph(Gd, Gm, ''); {Инициализация графического режима} If GraphResult <> grOk Then Halt(1); SetBkColor(Blue); {Устанавливаем цвет фона} ClearDevice; {Очищаем экран} Draw; {Выводим} While ch<>#27 Do Begin {Пока не нажата клавиша "Esc", вращаем} If keypressed Then ch:=readkey; {Считываем значение нажатой клавиши} VrachOY(pi/40); {Делаем поворот вокруг оси OY} ClearDevice; {Очищаем экран} Draw; Axis; {Выводим} OutTextXY(getmaxx div 2 + 10,10,'Y'); OutTextXY(135-10 ,GetMaxY div 2 + 10,'X'); OutTextXY(GetMaxX,GetMaxY-15,'Z'); OuttextXY(400,460,'Press <Esc> to Exit'); Delay(8000); End; CloseGraph; {Завершение работы в графическом режиме} END. |
| Всего записей: 62 | Зарегистр. 18-11-2011 | Отправлено: 23:31 20-05-2012 | Исправлено: Viwwna, 23:32 20-05-2012 |
|