Пример программы
В прямоугольной изометрической проекции нарисовать две параллельные линии, лежащие на плоскости 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.