Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 40032.doc
Скачиваний:
4
Добавлен:
30.04.2022
Размер:
203.26 Кб
Скачать

Пример программы

В прямоугольной изометрической проекции нарисовать две параллельные линии, лежащие на плоскости XY, а затем повернуть их на 90о против часовой стрелки вокруг осей X и Y, сдвинув на 150 пикселей изображение по оси Z и на 100 пикселей по оси Y. Фрагмент программы, реализующий построение локальной системы координат, выделен в отдельную процедуру. Рекомендуется фиксировать положение линий после каждого выполненного преобразования, что упрощает процесс отладки программы.

Листинг программы

Program Linii3;

uses

Graph, Crt;

var

GraphDriver:integer;

GraphMode:integer;

x11, x12, x21, x22, y11, y12, y21, y22, z11, z12, z21, z22:real; {координаты концов линий в исходном положении}

x11y, x12y, x21y, x22y, y11y, y12y, y21y, y22y, z11y, z12y, z21y, z22y:real; {модифицированные координаты после поворота вокруг оси Y}

x11x, x12x, x21x, x22x, y11x, y12x, y21x, y22x, z11x, z12x, z21x, z22x:real; {модифицированные координаты после поворота вокруг оси X}

x11m, x12m, x21m, x22m, y11m, y12m, y21m, y22m, z11m, z12m, z21m, z22m:real; {модифицированные координаты после сдвига по осям}

dx, dy:integer; {сдвиг локальных координат относительно глобальных}

sy, sz:real; {сдвиг изображения по осям Y и Z в локальной системе коорди- нат}

ax, ay:real; {углы поворота вокруг осей X и Y соответственно}

procedure XYZ(xn, yn:integer); {процедура построения трехмерной координатной системы на экране}

begin

SetLineStyle(0,0,1);

Line(xn, yn, xn, 5); {вычерчивание оси Z}

Line(xn, 5, xn-5, 15);

Line(xn, 5, xn+5, 15);

Line(xn, yn, 60, yn+Round((dx-60)*0.5774)); {вычерчивание оси X}

Line(60, yn+Round((dx-60)*0.5774), 64, yn+Round((dx-60)*0.5774)-10);

Line(60, yn+Round((dx-60)*0.5774), 71, yn+Round((dx-60)*0.5774));

Line(xn, yn, 580, yn+Round((580-dx)*0.5774)); {вычерчивание оси Y}

Line(580, yn+Round((580-dx)*0.5774), 576, yn+Round((580-dx)*0.5774)-10);

Line(580, yn+Round((580-dx)*0.5774), 569, yn+Round((580-dx)*0.5774));

SetColor(14); ); {установка цвета для вывода символов}

SetTextJustify(0,0); ); {установка стиля выравнивание текста}

SetTextStyle(0, 0, 1); {установка стиля текста}

OutTextXY(45, yn+Round((dx-60)*0.5774), 'X'); {вывод заголовка оси X}

OutTextXY(590, yn+Round((580-dx)*0.5774), 'Y'); {вывод заголовка оси Y

OutTextXY(xn-15, 15, 'Z'); {вывод заголовка оси Z}

end;

procedure Linii(x11p, x12p, y11p, y12p, z11p, z12p, x21p, x22p, y21p, y22p, z21p, z22p:real); {процедура вычерчивания линий}

begin

SetLineStyle(0, 0, 3); {изменение толщины линий}

SetColor(8); {установка цвета вычерчивания первой линии}

Line(dx+Round(0.71*(y11p-x11p)), dy+Round(0.82*(-z11p+0.5*(x11p+ y11p))), dx+Round(0.71*(y12p-x12p)), dy+Round(0.82*(-z12p+0.5* (x12p+y12p))));

SetColor(10); {установка цвета вычерчивания второй линии}

Line(dx+Round(0.71*(y21p-x21p)), dy+Round(0.82*(-z21p+0.5*(x21p+ y21p))), dx+Round(0.71*(y22p-x22p)), dy+Round(0.82*(-z22p+0.5* (x22p+y22p))));

end;

begin

GraphDriver:=Detect;

InitGraph(GraphDriver, GraphMode, '');

SetBkColor(9); {установка светло-синего цвета фона}

ClearDevice; {закрашивание экрана цветом фона}

dx:=320; {задание величин сдвига локальной системы координат относительно гло-бальной}

dy:=250;

XYZ(dx, dy); {вычерчивание трехмерной системы координат на экране}

x11:=0; {задание координат концевых точек линий}

y11:=0; z11:=0; x12:=0; y12:=100; z12:=0; x21:=50;

y21:=0;

z21:=0;

x22:=50;

y22:=100;

z22:=0;

Linii(x11, x12, y11, y12, z11, z12, x21, x22, y21, y22, z21, z22); {вычерчивание линий в исходном состоянии}

Readln; {задержка изображения до нажатия клавиши Enter}

ay:=1.57; {задание угла поворота изображения вокруг оси Y}

ax:=1.57; {задание угла поворота изображения вокруг оси X}

sy:=100; {задание сдвига по оси Y}

sz:=150; {задание сдвига по оси Z}

{вычисление координат изображения, повернутого вокруг оси Y}

x11y:=x11*cos(ay)+z11*sin(ay);

y11y:=y11;

z11y:=-x11*sin(ay)+z11*cos(ay);

x12y:=x12*cos(ay)+z12*sin(ay);

y12y:=y12;

z12y:=-x12*sin(ay)+z12*cos(ay);

x21y:=x21*cos(ay)+z21*sin(ay);

y21y:=y21;

z21y:=-x21*sin(ay)+z21*cos(ay);

x22y:=x22*cos(ay)+z22*sin(ay);

y22y:=y22;

z22y:=-x22*sin(ay)+z22*cos(ay);

Linii(x11y, x12y, y11y, y12y, z11y, z12y, x21y, x22y, y21y, y22y, z21y, z22y); {отображение линий, повернутых вокруг оси Y на 900}

Readln;

{вычисление координат изображения, повернутого вокруг оси X}

x11x:=x11y;

y11x:=y11y*cos(ax)-z11y*sin(ax);

z11x:=y11y*sin(ax)+z11y*cos(ax);

x12x:=x12y;

y12x:=y12y*cos(ax)-z12y*sin(ax);

z12x:=y12y*sin(ax)+z12y*cos(ax);

x21x:=x21y;

y21x:=y21y*cos(ax)-z21y*sin(ax);

z21x:=y21y*sin(ax)+z21y*cos(ax);

x22x:=x22y;

y22x:=y22y*cos(ax)-z22y*sin(ax);

z22x:=y22y*sin(ax)+z22y*cos(ax);

Linii(x11x, x12x, y11x, y12x, z11x, z12x, x21x, x22x, y21x, y22x, z21x, z22x); {отображение линий, повернутых вокруг оси X на 900}

Readln;

x11m:=x11x;

x12m:=x12x;

x21m:=x21x;

x22m:=x22x;

{вычисление координат изображения, cдвинутого по оси Y}

y11m:=y11x+sy;

y12m:=y12x+sy;

y21m:=y21x+sy;

y22m:=y22x+sy;

{вычисление координат изображения, сдвинутого по оси Z}

z11m:=z11x+sz;

z12m:=z12x+sz;

z21m:=z21x+sz;

z22m:=z22x+sz;

Linii(x11m, x12m, y11m, y12m, z11m, z12m, x21m, x22m, y21m, y22m, z21m, z22m); {отображение линий в конечном положении}

Readln;

Closegraph; {выход из графического режима}

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]