Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lrgraph

.pdf
Скачиваний:
12
Добавлен:
11.03.2016
Размер:
749.88 Кб
Скачать

41

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;

42

end.

Варианты задания

Создать программу, реализующую графическими средствами языка программирова-

ния TurboPascal изображения, включающие:

а) локальную систему координат;

б) в начале первого квадранта координат исходное изображение, левая нижняя точка которого имеет координаты (10, 10), а элементы изображения имеют размер не менее 50 пик-

селей и разную расцветку;

в) преобразованное в соответствии с заданием изображение.

1) ─┼─ - образная фигура зеркально отображается относительно оси Х и увеличивается в 1.5

раза;

2) ─┼─ - образная фигура перемещается вверх на 90 и влево на 150 пикселей с поворотом на

40о по часовой стрелке;

3)┌─ - образная фигура зеркально отображается относительно диагонали первого квадранта

иувеличивается в 2 раза;

4)прямоугольный треугольник перемещается вниз на 40 и вправо на 200 пикселей с поворо-

том против часовой стрелки на 50о;

5) прямоугольник перемещается вверх на 120 и вправо на 200 пикселей с поворотом по часо-

вой стрелке на 70о;

6) T - фигура зеркально отображается относительно оси Y и поворачивается на 15о по часо-

вой стрелке;

7)┌─┐- образная фигура смещается вниз на 120 и влево на 140 пикселей с поворотом против часовой стрелки на 73о;

8)правильная трапеция зеркально отображается относительно диагонали первого квадранта

иуменьшается в 2 раза;

9)- образная фигура поворачивается на 180о и увеличивается в 1.3 раза;

10)закрашенный треугольник смещается влево на 230 и вниз на 50 пикселей с поворотом по часовой стрелке на 49о;

11)┼┼ - образная фигура зеркально отображается относительно оси Х с поворотом по часовой стрелке на 36о;

43

12) закрашенный равнобедренный треугольник смещается влево на 130 и вниз на 150 пиксе-

лей с поворотом по часовой стрелке на 79о; 13) ± - образная фигура смещается вправо на 60 и вниз на 200 пикселей с увеличением в 2.3

раза;

14) ┌─┘- образная фигура зеркально отображается относительно оси Y и уменьшается в 1.4

раза;

15) Х - образная фигура поворачивается на 70о против часовой стрелки со смещением влево на

60 и вниз на 140 пикселей;

16)/\ - образная фигура поворачивается на 180о, смещаясь влево и вниз на 100 пикселей;

17)├┤ - образная фигура зеркально отображается относительно диагонали первого квадранта с увеличением в 1.5 раза;

18)И - образная фигура зеркально отображается относительно оси Х с поворотом по часовой стрелке на 34о;

19)N - образная фигура смещается вверх на 90 и влево на 120 пикселей с поворотом по часо-

вой стрелке на 56о;

20) ┬┬ - образная фигура смещается вправо на 140 и вниз на 70 пикселей с увеличением в 1.4

раза;

21) - образная фигура зеркально отображается относительно оси У и увеличивается в 2

раза;

22) - образная фигура перемещается вверх на 90 и влево на 180 пикселей с поворотом на

60о по часовой стрелке;

23)- образная фигура зеркально отображается относительно диагонали первого квадранта

иувеличивается в 2 раза;

24)прямоугольный треугольник перемещается вверх на 30 и вправо на 180 пикселей с пово-

ротом против часовой стрелки на 60о;

25)≠ - образная фигура смещается вниз на 120 и влево на 140 пикселей с увеличением в два

раза;

26)╫ - образная фигура зеркально отображается относительно диагонали первого квадранта

иуменьшается в 2 раза;

44

Выполнение лабораторной работы

1.Получить задание у преподавателя.

2.Написать и отладить на компьютере программу, реализующую требуемое изобра-

жение без масштабирования.

3.Если изображение искажено, ввести масштабирующие коэффициенты.

4.Результат работы программы продемонстрировать преподавателю.

5.Напечатать листинг программы.

Содержание отчета

Отчет включает:

1)содержание задания;

2)блок-схему программы;

3)листинг программы.

Контрольные вопросы

1.Какие геометрические преобразования называются аффинными?

2.Какие существуют виды геометрического преобразования?

3.Каким квадрантом прямоугольной системы координат представлен экран дисплея по умолчанию?

4.Для чего используется при геометрических построениях процедура языка Паскаль

GetAspectRatio?

5. Можно ли совместить при геометрическом преобразовании сдвиг и масштабирова-

ние?

Рекомендуемая литература

1.Котов Ю.В. Как рисует машина. - М.: Наука., 1988. - 224 с.

2.Белецкий Я. ТурбоПаскаль с графикой для персональных компьютеров. - М.: Машино-

строение, 1991. - 320 с.

45

3.Епанешников А.М., Епанешников В.А. Программирование в среде TurboPascal 7.0. - М.: "ДИАЛОГ_МИФИ", 1993. - 288 с.

4.Мизурохи С.В. TURBO PASCAL и объектно-ориентированное программирование. - М.:

Финансы и статистика, 1992. - 192 с.

5.Техтран - система программирования оборудования с ЧПУ/ А.А. Лиферов, О.Ю. Батунер,

М.Ю. Блюдзе и др. - Л.: Машиностроение, 1987. - 109 с.

6.Грувер М., Зиммер Э. САПР и автоматизация производства. - М.: Мир, 1987. - 528 с.

46

Лабораторная работа №6

Динамическое преобразование двумерных координат

Цель работы: изучение алгоритмов построения динамических изображений со сложным преобразованием координат в графическом режиме.

Введение

Данный вид изображений находит широкое применение в компьютерной графике для синтеза мнемосхем, моделирования технологических процессов и перемещений роботов, расширения изобразительных возможностей человеко-машинного интерфейса. Сам процесс построения базируется на алгоритмах, рассмотренных ранее, в лабораторных работах №2 и 4, а методы преобразования координат подробно представлены в предыдущей работе.

Описание среды программирования

Данные преобразования, как и в предыдущих лабораторных работах, реализуются в среде языка программирования TurboPascal. Все требуемые средства языка рассмотрены ранее. В качестве рекомендации следует предложить реализацию задания на основе алгоритма со сменой графических страниц, что создает более качественное изображение. Использование для регенерации подвижной части изображения окон или выделенных прямоугольных фрагментов не рекомендуется, так как поворот изображения при движении или его масштабирование затрудняют определение координат углов используемого участка экрана.

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

В локальной системе координат нарисовать две параллельные вертикальные линии. Нижняя координата левой линии находится в точке (20, 10). Сдвинуть данную точку до координаты (60, 90) с дискретом 1 пиксель, поворачивая рисунок на каждом шаге на 1о против часовой стрелки.

Для реализации задания используем алгоритм, приведенный на рис. 4.1. Листинг программы

Program Povorot;

47

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; {угол поворота в радианах}

y:integer; {угол поворота в градусах} i:byte; {переменная цикла}

sx, sy:integer; {величина сдвига изображения по осям X и Y в локальной системе коорди-

нат}

ns:byte; {номер графической страницы}

procedure XY(xn, yn:integer); {процедура создания на экране локальных координат. Лис-

тинг смотри в предыдущей лабораторной работе}

begin GraphDriver:=3; GraphMode:=1;

InitGraph(GraphDriver, GraphMode, '');

SetBkColor(9); {установка цвета фона изображения}

GetAspectRatio(mx, my); {определение коэффициентов масштабирования}

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

ной}

dy:=300;

y:=0; {начальная величина угла поворота в градусах}

48

sy:=0; {начальная величина сдвига изображения по оси Y в локальной системе коорди-

нат}

ns:=0; {номер активной графической страницы}

x11:=20; {координаты концов линий в локальной системе координат} y11:=10;

x12:=20;

y12:=110;

x21:=70;

y21:=10;

x22:=70;

y22:=110;

for sx:=0 to 80 do {цикл по величине сдвига изображения по оси X относительно локаль-

ной системы координат}

begin

if ns=0 then {смена активной и видимой графических страниц} begin

SetActivePage(0);

SetVisualPage(1) end

else begin

SetActivePage(1);

SetVisualPage(0)

end;

ClearDevice; {очистка активной страницы}

XY(dx, dy): {вычерчивание локальной системы координат}

SetColor(7); {установка цвета линий в исходном положении}

SetLineStyle(0, 0, 3); {установка толщины линий в исходном положении} {отображение линий в исходном положении}

Line(dx+x11, dy-Round(mx/my*y11), dx+x12, dy-Round(mx/my*y12));

49

Line(dx+x21, dy-Round(mx/my*y21), dx+x22, dy-Round(mx/my*y22)); a:=y*6.28/360; {определение величины угла в радианах}

SetColor(13); {установка цвета перемещаемых линий} {отображение перемещаемых линий}

Line(dx+Round(cos(a)*x11-sin(a)*y11)-sx, dy-(Round(mx/my*(sin(a) *x11 +cos(a) *y11+sy))), dx+Round(cos(a)*x12-sin(a)*y12)-sx, dy-(Round(mx/my*(sin(a)*x12 +cos(a)*y12+sy))));

Line(dx+Round(cos(a)*x21-sin(a)*y21)-sx, dy-(Round(mx/my*(sin(a)*x21 +cos(a) *y21+sy))), dx +Round(cos(a)*x22-sin(a)*y22)-sx, dy-(Round(mx/my*(sin(a)*x22 +cos(a)*y22+sy))));

y:=y+1; {изменение величины угла поворота в градусах}

sy:=sy+1; {изменение величины сдвига по оси Y относительно локальной системы ко-

ординат }

if ns=0 then {смена номера активной графической страницы} ns:=1

else ns:=0;

Delay(500); {задержка изображения на каждом шаге перемещения} end;

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

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

В данном варианте реализации задания на каждом шаге цикла производится повторное по-

строение координатных осей, так как они уничтожаются при очередной очистке экрана. Вари-

ант со стиранием на каждом шаге только перемещающихся линий приводит к тому, что исче-

зает и часть координатных осей, если они пересекаются линиями при движении. Последний вариант может быть реализован только при перемещении изображения в первом квадранте.

Варианты задания

50

Создать программу, реализующую средствами графики языка программирования TurboPascal следующее динамическое изображение:

а) фигура для построения определяется в соответствии с заданиями, приведенными в лабораторной работе N5;

б) исходной изображение строится в начале первого квадранта. Левая нижняя точка изображения имеет координаты (20, 10);

в) изображение перемещается в соответствии со следующими вариантами задания:

1)сдвиг до точки (120, -30) с поворотом на каждом шаге на 1о по часовой стрелке;

2)сдвиг до точки (-60, 60) с увеличением к концу движения фигуры в два раза;

3)сдвиг до точки (100, 90) с поворотом против часовой стрелки на 2о на каждом шаге;

4)сдвиг до точки (-60, -30) с поворотом по часовой стрелке на 3о на каждом шаге;

5)сдвиг до точки (100, -80) с уменьшением к концу движения фигуры в два раза;

6)сдвиг до точки (-80, 60) с поворотом против часовой стрелки на каждом шаге на 1о;

7)сдвиг до точки (140, 130) с поворотом по часовой стрелке на каждом шаге на 2о;

8)сдвиг до точки (70, -80) с увеличением к концу движения фигуры в 1.5 раза;

9)сдвиг до точки (70, 80) с поворотом против часовой стрелки на каждом шаге на 3о;

10)сдвиг до точки (-130, -120) с уменьшением фигуры к концу движения в 2 раза;

11)сдвиг до точки (-60, 170) с поворотом по часовой стрелке на каждом шаге на 1о;

12)сдвиг до точки (80, -110) с поворотом против часовой стрелки на каждом шаге на 2о;

13)сдвиг до точки (140, 130) с поворотом против часовой стрелки на каждом шаге на 3о;

14)сдвиг до точки (-100, -110) с увеличением к концу движения фигуры в 2 раза;

15)сдвиг до точки (-200, 120) с уменьшением к концу движения фигуры в 2 раза;

16)сдвиг до точки (150, -120) с поворотом по часовой стрелке на каждом шаге на 1о;

17)сдвиг до точки (-280, 160) с поворотом против часовой стрелки на каждом шаге на 2о;

18)сдвиг до точки (300, 150) с поворотом по часовой стрелке на каждом шаге на 3о;

19)сдвиг до точки (-280, -140) с поворотом против часовой стрелки на каждом шаге на 1о;

20)сдвиг до точки (60, 170) с уменьшением к концу движения фигуры в 2 раза;

21)сдвиг до точки (120, 30) с поворотом на каждом шаге на 2о по часовой стрелке;

22)сдвиг до точки (-60, 60) с уменьшением к концу движения фигуры в два раза;

23)сдвиг до точки (50, 190) с поворотом против часовой стрелки на 1о на каждом шаге;

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