Консультация № 175591
24.12.2009, 18:12
35.00 руб.
0 6 1
Здравствуйте, по компьютерной графике задали такое задание:
вывести на экран проволочный куб, расположенный в изометрической проекции и крутить его вокруг оси Z.
При этом нельзя использовать библотеки вроде openGl.
Я уже кое-что накидал (читай нашел в интернете =)), вот только не могу разобраться как сделать изометрию и поворачивать именно вокруг оси, а не вокруг начала координат.
Помогите пожалуйста
Код в приложении

Приложение:
program Paralel;
USES Crt, Graph;
VAR Gd, Gm: Integer;
par: array[1..8, 1..3] of real;
rebra: array[1..12, 1..2] of integer;
i: integer;
ch: char;

PROCEDURE Draw;
VAR x1,x2,y1,y2: integer;
ver1,ver2: integer;
BEGIN
For i:=1 To 12 Do Begin
ver1:=rebra[i,1];
ver2:=rebra[i,2];
x1:=round(par[ver1,1])+320;
y1:=240-round(par[ver1,2]);
x2:=round(par[ver2,1])+320;
y2:=240-round(par[ver2,2]);
line(x1,y1,x2,y2);
End;
END;

PROCEDURE VrachOX(Ugol: real);
VAR y,z: real;
BEGIN
For i:=1 To 8 Do Begin
y:=par[i,2];
z:=par[i,3];
par[i,2]:=y*cos(Ugol)-z*sin(Ugol);
par[i,3]:=y*sin(Ugol)+z*cos(Ugol);
End;
End;

PROCEDURE VrachOY(Ugol: real);
VAR x,z: real;
BEGIN
For i:=1 To 8 Do Begin
x:=par[i,1];
z:=par[i,3];
par[i,1]:=x*cos(Ugol)+z*sin(Ugol);
par[i,3]:=-x*sin(Ugol)+z*cos(Ugol);
End;
END;

PROCEDURE VrachOZ(Ugol: real);
VAR x,y: real;
BEGIN
For i:=1 To 8 Do Begin
x:=par[i,1];
y:=par[i,2];
par[i,1]:=x*cos(Ugol)-y*sin(Ugol);
par[i,2]:=x*sin(Ugol)+y*cos(Ugol);
End;
END;

BEGIN

par[1,1]:=0; par[1,2]:=0; par[1,3]:=0;
par[2,1]:=0; par[2,2]:=170; par[2,3]:=0;
par[3,1]:=170; par[3,2]:=170; par[3,3]:=0;
par[4,1]:=170; par[4,2]:=0; par[4,3]:=0;
par[5,1]:=0; par[5,2]:=0; par[5,3]:=170;
par[6,1]:=0; par[6,2]:=170; par[6,3]:=170;
par[7,1]:=170; par[7,2]:=170; par[7,3]:=170;
par[8,1]:=170; par[8,2]:=0; par[8,3]:=170;

rebra[1,1]:=1; rebra[1,2]:=2;
rebra[2,1]:=2; rebra[2,2]:=3;
rebra[3,1]:=3; rebra[3,2]:=4;
rebra[4,1]:=4; rebra[4,2]:=1;
rebra[5,1]:=5; rebra[5,2]:=6;
rebra[6,1]:=6; rebra[6,2]:=7;
rebra[7,1]:=7; rebra[7,2]:=8;
rebra[8,1]:=8; rebra[8,2]:=5;
rebra[9,1]:=1; rebra[9,2]:=5;
rebra[10,1]:=2; rebra[10,2]:=6;
rebra[11,1]:=3; rebra[11,2]:=7;
rebra[12,1]:=4; rebra[12,2]:=8;

Gd:= detect;
Initgraph(Gd, Gm, 'c:\Bp\bgi');
If GraphResult <> grOk Then
Halt(1);

SetBkColor(Black);
ClearDevice;
VrachOX(pi/12);
VrachOY(pi/12);
VrachOZ(pi/12);
While ch<>#27 Do Begin
ClearDevice;
Draw;
OuttextXY(10,450,'Press <1> for rotation');
OuttextXY(10,465,'Press <Esc> to Exit');
ch:=readkey;
Case ch Of
#77: VrachOY(pi/30);
End;
End;
CloseGraph;
END.

Обсуждение

давно
Профессионал
304622
583
25.12.2009, 18:13
общий
это ответ
Здравствуйте, Chebyrekk.

Начальный наклон возникает в следствие команд:
VrachOX(pi/12);
VrachOY(pi/12);
VrachOZ(pi/12);
стоящих перед циклом. Очевидно, что они поворачивают конструкцию на угол pi/12 относительно трёх экранных координатных осей по очереди.

Далее. Насколько я понял, ось Z -- это ось кубика. В начале программы она совпадает с экранной осью Z. В дальнейшем её направление пределяется вершинами кубика. Из исходных данных видно, что она определяется 1-й и 5-й точками. Удобно то, что вращение кубика в процедурах VrachOX и т.д. считается относительно (0,0,0), т.е. 1-я точка остается неподвижной, а ось Z полностью описывается 5-й точкой.

Таким образом, имеем точку с координатами
x:=par[5,1];
y:=par[5,2];
z:=par[5,3];
Тангенс угла радиус-вектора этой точки к плоскости XY задаётся отношением координаты z к проекции на плоскость -- это гипотенуза и два катета. В свою очередь проекция на плоскость является гипотенузой для координат x и y. Значит,
pz:=sqrt(sqr(x)+sqr(y));
ugol:=arctan(z/pz)/pi*180;

Итого, у меня получилось примерно 68,9 градусов.
5
Спасибо за подробный ответ, но вроде это немного не то )) <br>Выяснить бы еще уравнение картинной плоскости, а там уже можно было бы и угол посчитать =)
Неизвестный
26.12.2009, 10:25
общий
Сергей Бендер:
А у меня получилось примерно 35 градусов )) то есть arcsin 1/sqrt(3), число взято из википедии
Изометрический вид объекта можно получить, выбрав направление обзора таким образом, чтобы углы между проекцией осей x, y, и z были одинаковы и равны 120°. К примеру, если взять куб, это можно выполнить направив взгляд на одну из граней куба, после чего повернув куб на ±45° вокруг вертикальной оси и на ±arcsin (tan 30°) ≈ 35.264° вокруг горизонтальной оси.
Вроде как поворот вокруг горизонтальной оси и даст нам угол картинной плоскости к оси Z.
Препод сказал, что это правильно, но потом потребовал написать уравнение картинной плоскости, но вот с этим возникла проблема, так как в инете нет, а сам препод не признается. =)
давно
Профессионал
304622
583
27.12.2009, 23:02
общий
Chebyrekk:
Нет, давай отделять мух от котлет. Я давал ответ о том угле, что получается у тебя в _программе_. Да, в изометрической проекции угол составит 35 градусов, но просто в представленной тобой программе _нет_ изометрии. Там некий вид полученный последовательными поворотами по трём осям на пи/12. Какой угол требуется твоему преподавателю: из теоретических данных об изометрии или из конкретного вида в конкретной программе?

Ещё. Я несколько не понял про уравнение картинной плоскости. В каких координатах оно должно быть задано? Считать оси кубика абсолютной системой координат? Учти, в твоей программе координаты вершин задаются и пересчитываются в экранной системе. Т.е. с точки зрения программы вопрос об уравнении картинной (экранной) плоскости бессмысленен. (Насколько я понял.)
Неизвестный
28.12.2009, 06:00
общий
Сергей Бендер:
собственно да, все как бы должно быть в изометрии, и в вопросе я об этом писал =) а на счет всего остального, то я сам ничего не понимаю... на лекциях нам ничего не давали такого, единственное что он сказал, это что за картиннуб плоскость нужно считать экран монитора. Программа составлялась для усвоения матриц поворота, а все остальные вопросы уже с ней не связаны. Это наш препод просто решил поиздеваться )) так что как и где считать угол уже не важно, главное посчитать и привести доказательство =)
давно
Профессионал
304622
583
28.12.2009, 18:31
общий
Ну-у, не бывает так, чтоб _ничего_ не давали. Предмет-то какой?
Неизвестный
29.12.2009, 07:56
общий
Сергей Бендер:
компьютерная графика, вот только действительно нам ничего про это не рассказали =) карантин же был, вот мы и остановились только на матрицах поворота, а проецирование не успели... А самому тяжело разбираться, учитывая то что геометрию и тригонометрию я последний раз в глаза видел лет так 6 назад...
Форма ответа