- •Методические указания
- •Лабораторная работа №8 Преобразование двумерных координат. Динамическое Преобразование координат.
- •Пример программы
- •Динамическое преобразование двумерных координат
- •Пример программы
- •Пример программы
- •6. Варианты задания
- •7. Контрольные вопросы
- •Библиографический список
- •Содержание
- •394026 Воронеж, Московский просп., 14
Пример программы
В первом квадранте локальной системы координат нарисовать две вертикальные параллельные линии, а затем сдвинуть их вверх и вправо на 100 пикселей и повернуть на 30о против часовой стрелки относительно начала локальных координат.
Начало локальной системы координат расположим в точке (300, 320) пикселей. Можно дополнить программу возможностью задания начала в диалоговом режиме при каждом запуске программы. Фрагмент программы, используемый для создания на экране локальной системы координат, выделен в отдельную процедуру, чтобы его можно было использовать в следующей лабораторной работе.
Листинг программы
Program Linii;
uses
Graph, Crt;
var
GraphDriver:integer;
GraphMode:integer;
mx, my:word; {кооффициенты масштабирования}
x11, x12, x21, x22, y11, y12, y21, y22:integer; {координаты концов линий}
dx, dy:integer; {сдвиг локальных координат относительно глобальных}
a:real; {угол поворота}
x0, y0:integer; {величина сдвига линий в системе локальных координат}
procedure XY(xn, yn:integer); {процедура создания на экране локальных координат}
begin
SetLineStyle(0,0,1); {установка стиля линий}
Line(xn, 300, xn, 50); {отображение на экране системы координат}
Line(xn, 50, xn-5, 60);
Line(xn, 50, xn+5, 60);
Line(40, yn, 600, yn);
Line(600, yn, 593, yn-3);
Line(600, yn, 593, yn+3);
SetColor(4); {установка цвета для вывода символов}
SetTextJustify(0,0); {установка стиля выравнивания текста}
SetTextStyle(0, 0, 1); {установка стиля текста}
OutTextXY(597, yn+15, 'X'); {вывод заголовка оси Х}
OutTextXY(xn-10, 50, 'Y'); {вывод заголовка оси Y}
end;
begin
GraphDriver:=3; {установка графического режима EGA}
GraphMode:=1; {установка подрежима с разрешением 640x350}
InitGraph(GraphDriver, GraphMode, '' '');
SetBkColor(9); {установка светло-синего цвета фона}
ClearDevice; {закрашивание экрана цветом фона}
GetAspectRatio(mx, my); {определение коэффициентов масштабирования}
dx:=320; {задание величин сдвига локальной системы координат относительно глобальной}
dy:=300;
XY(dx, dy); {вычерчивание локальной системы координат}
SetColor(7); {установка цвета исходных линий}
SetLineStyle(0, 0, 3); {изменение толщины линий}
x11:=50; {задание координат концевых точек линий в локальной системе координат}
y11:=50;
x12:=50;
y12:=150;
x21:=100;
y21:=50;
x22:=100;
y22:=150;
{вычерчивание исходных линий}
Line(dx+x11, dy-Round(mx/my*y11), dx+x12, dy-Round(mx/my*y12));
Line(dx+x21, dy-Round(mx/my*y21), dx+x22, dy-Round(mx/my*y22));
SetColor(13); {установка цвета преобразованных линий}
a:= 30*6.28/360; {определение угла поворота в радианах}
x0:=100; {задание величин сдвига линий в локальной системе координат}
y0:=100;
Line(dx+Round(cos(a)*x11-sin(a)*y11)+x0, dy-(Round(mx/my*(sin(a)*x11+cos(a)*y11) +y0)), dx+Round(cos(a)*x12-sin(a)*y12)+x0, dy-(Round(mx/my*(sin(a)*x12+cos(a) *y12)+y0)));
Line(dx+Round(cos(a)*x21-sin(a)*y21)+x0, dy-(Round(mx/my*(sin(a)*x21+cos(a)*y21) +y0)), dx+Round(cos(a)*x22-sin(a)*y22)+x0, dy-(Round(mx/my*(sin(a)*x22+cos(a) *y22)+y0)));
Readln;
Closegraph;
end.