Главная страница

РЕАЛИЗАЦИЯ ДВУМЕРНЫХ АФФИННЫХ ПРЕОБРАЗОВАНИЙ. ЛР2. Томский государственный университет систем


Скачать 476 Kb.
НазваниеТомский государственный университет систем
АнкорРЕАЛИЗАЦИЯ ДВУМЕРНЫХ АФФИННЫХ ПРЕОБРАЗОВАНИЙ
Дата23.12.2021
Размер476 Kb.
Формат файлаdoc
Имя файлаЛР2.doc
ТипОтчет
#314985

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное образовательное

учреждение высшего образования

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ

УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)

Факультет систем управления
Кафедра АСУ

РЕАЛИЗАЦИЯ
ДВУМЕРНЫХ АФФИННЫХ ПРЕОБРАЗОВАНИЙ


Отчет о выполнении лабораторной работы №2

по дисциплине "Компьютерная графика"

Вариант № 2

Томск 2021

Содержание


ВВЕДЕНИЕ 3

ОСНОВНАЯ ЧАСТЬ 4

Описание используемой среды программирования 4

Описание графических возможностей PASCALABC 6

Управление графическим окном 6

Процедуры рисования графических примитивов 6

Процедуры, используемые для работы с цветом 6

Процедуры для работы с текстом 6

Цвета в PascalABC 7

События модуля GraphABC 7

ОПИСАНИЕ МЕТОДА РЕШЕНИЯ ЗАДАЧИ 8

ОПИСАНИЕ ФУНКЦИОНАЛЬНЫХ ВОЗМОЖНОСТЕЙ РАЗРАБОТАННОГО ПРИЛОЖЕНИЯ 14

ЗАКЛЮЧЕНИЕ 15

ПРИЛОЖЕНИЕ 1. ВИД ОКНА ПРОГРАММЫ ПОСЛЕ ВЫПОЛНЕНИЯ НЕКОТОРЫХ ПРЕОБРАЗОВАНИЙ 16

ПРИЛОЖЕНИЕ 2. ЛИСТИНГ ПРОГРАММЫ 20



ВВЕДЕНИЕ



Задание:

Согласно варианту заданий, приведенному на рисунке 1, построить двумерное изображение заданной фигуры. Над фигу­рой выполнить все аффинные преобразования: перенос, отраже­ние, масштабирование, поворот.

Рисунок 1. Задание, вариант 2


ОСНОВНАЯ ЧАСТЬ

Описание используемой среды программирования


При выполнении лабораторной работы использовался PascalABC .

В 2003 году на факультете математики, механики и компьютерных наук ЮФУ была создана учебная среда программирования Pascal ABC. Система представляла собой интегрированную оболочку со встроенным интерпретатором языка программирования Паскаль, близкого к языку Delphi. Несмотря на неполную реализацию языка, она стала удачной заменой устаревшей системе Turbo Pascal в первоначальном обучении программированию. Как учебную систему её использовали во многих регионах СНГ. В каталоге Soft@Mail.ru программа Pascal ABC в 2006 году признавалась программой недели.

7 марта 2021 г. вышла версия PascalABC.NET 3.8.

Язык PascalABC.NET включает в себя практически весь стандартный язык Паскаль, а также большинство языковых расширений языка Delphi. Однако, этих средств недостаточно для современного программирования. Именно поэтому PascalABC.NET расширен рядом конструкций, а его стандартный модуль - рядом подпрограмм, типов и классов, что позволяет создавать легко читающиеся приложения средней сложности.

Кроме этого, язык PascalABC.NET использует большинство средств, предоставляемых платформой .NET: единая система типов, классы, интерфейсы, исключения, делегаты, перегрузка операций, обобщенные типы (generics), методы расширения, лямбда-выражения.

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

В распоряжении PascalABC.NET находятся все средства .NET-библиотек классов, постоянно расширяющихся самыми современными возможностями. Это позволяет легко писать на PascalABC.NET приложения для работы с сетью, Web, XML-документами, использовать регулярные выражения и многое другое.

Язык PascalABC.NET позволяет программировать в классическом процедурном стиле, в объектно-ориентированном стиле и содержит множество элементов для программирования в функциональном стиле. Выбор стиля или комбинации этих стилей - дело вкуса программиста, а при использовании в обучении - методический подход преподавателя.

Сочетание богатых и современных языковых средств, возможностей выбора разных траекторий обучения позволяет рекомендовать PascalABC.NET с одной стороны как язык для обучения программированию (от школьников до студентов младших и средних курсов), с другой - как язык для создания проектов и библиотек средней сложности.

Интегрированная среда разработки PascalABC.NET ориентирована на создание проектов малой и средней сложности. Она достаточно легковесна и в то же время обеспечивает разработчика всеми необходимыми средствами, такими как встроенный отладчик, средства Intellisense (подсказка по точке, подсказка по параметрам, всплывающая подсказка по имени), переход к определению и реализации подпрограммы, шаблоны кода, автоформатирование кода.

В среду PascalABC.NET встроен также дизайнер форм, позволяющий создавать полноценные оконные приложения в стиле RAD (Rapid Application Development - быстрое создание приложений).

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

В среде PascalABC.NET большое внимание уделено связи запущенной программы с оболочкой: консольная программа, запущенная из-под оболочки, осуществляет ввод-вывод в специальное окно, встроенное в оболочку. Можно также запустить несколько программ одновременно - все они будут контролироваться оболочкой.

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

Кроме этого, внутренние представления PascalABC.NET позволяют создавать компиляторы других языков программирования и встраивать их в среду разработки с помощью специальных плагинов.

Платформа Microsoft.NET обеспечивает PascalABC.NET стандартной библиотекой, состоящей из огромного количества класссов для решения практически любых задач: от алгоритмических до прикладных. Именно поэтому в PascalABC.NET отсутствует необходимость в разработке большого числа собственных модулей.

Собственные модули, которые имеются в PascalABC.NET, ориентированы именно на начальное обучение программированию.

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

Кроме этого, среда PascalABC.NET содержит модуль электронного задачника Programming Taskbook (автор Абрамян М.Э.), позволяющий осуществлять автоматическую постановку и проверку заданий. Имеются также модули для преподавателя, позволяющие создавать задания для исполнителей Робот, Чертежник и электронного задачника.

Модуль растровой графики GraphABC и модуль векторных графических объектов ABCObjects могут быть использованы для создания простейших графических. а также интерактивных анимационных приложений, управляемых событиями.

Следует также отметить студенческие модули: модуль Collections упрощенных коллекций, модуль Arrays для простейших операций с динамическими массивами и модуль Forms для ручного создания простых приложений с оконным пользовательским интерфейсом.

Описание графических возможностей PASCALABC

Управление графическим окном


Процедура/Функция

Описание

SetWindowWidth(w);

Устанавливает ширину графического окна

SetWindowHeight(h);

Устанавливает высоту графического окна

ClearWindow;

Очищает графический экран белым цветом.

clearWindow(color);

Очищает графическое окно указанным цветом.

После запуска PascalABC, по умолчанию, запускается текстовый режим. Для работы с графикой служит отдельное графическое окно.

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

С их помощью можно создавать разнообразные графические изображения и сопровождать их текстовыми надписями.

Подключение осуществляется в разделе описаний. Формат подключения модуля GraphABC: Uses GraphABC;

Графический экран PascalABC (по умолчанию) содержит 640 точек по горизонтали и 400 точек по вертикали. Начало отсчета – левый верхний угол экрана. Ось x направлена вправо, а ось y –вниз. Координаты исчисляются в пикселях.

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

Процедуры рисования графических примитивов


Процедура

Описание

SetPixel(x, у, color)

Закрашивает один пикселе координатами х, у цветом color

Line (xl, yl, x2, y2)

Рисут отрезок прямой ограниченный точками с координатами (xl, yl) и (х2, у2)

LineTo(x, y)

Рисует отрезок из текущей точки в точку с координатами (х, у)

Процедуры, используемые для работы с цветом


Процедура

Описание

SetPenColor(color)

Устанавливает цвет пера (линий).

SetPenWidth(n)

Устанавливает ширину (толщину) пера, равную n пикселям.

Процедуры для работы с текстом


Процедура/Функция

Описание

TextOut(x, у, St)

Выводит строку текста St в заданную координатами х и у позицию

SetFontColor(color)

Устанавливает цвет шрифта

Цвета в PascalABC


Перечислим цвета, которые будут применяться в программе:

clBlack – черный;

clRed – красный (линии фигуры);

clGreen – зеленый (текст меню);

clBlue – синий (оси координат).

События модуля GraphABC


Графическая программа продолжает выполняться даже после того как выполнены все операторы основной программы. Графическое окно реагирует на события мыши, клавиатуры, событие изменения размеров окна и событие закрытия окна. Данные события определены в модуле GraphABC и представляют собой процедурные переменные:
 OnMouseDown: procedure (x,y,mousebutton: integer);
        Событие нажатия на кнопку мыши. (x,y) - координаты курсора мыши в момент наступления события, mousebutton = 1, если нажата левая кнопка мыши, и 2, если нажата правая кнопка мыши

OnMouseUp: procedure (x,y,mousebutton: integer) - событие отжатия кнопки мыши. (x,y) - координаты курсора мыши в момент наступления события, mousebutton = 1, если отжата левая кнопка мыши, и 2, если отжата правая кнопка мыши

OnMouseMove: procedure (x,y,mousebutton: integer) - событие перемещения мыши. (x,y) - координаты курсора мыши в момент наступления события, mousebutton = 0, если кнопка мыши не нажата, 1, если нажата левая кнопка мыши, и 2, если нажата правая кнопка мыши.

OnKeyDown: procedure (key: integer) - событие нажатия клавиши. key - виртуальный код нажатой клавиши

OnKeyUp: procedure (key: integer) - событие отжатия клавиши. key - виртуальный код отжатой клавиши

OnKeyPress: procedure (ch: char) -  событие нажатия символьной клавиши. ch - символ, генерируемый нажатой символьной клавишей

OnResize: procedure;     событие изменения размера графического окна

OnClose: procedure;        событие закрытия графического окна

Если переменной-событию присвоена некоторая процедура, она называется обработчиком данного события и автоматически вызывается при наступлении указанного события.

Параметры x и y в обработчиках OnMouseDown, OnMouseUp и OnMouseMove определяют координаты курсора мыши в момент наступления события, параметр mousebutton равен 0, если кнопка мыши не нажата, 1, если нажата левая кнопка мыши, и 2, если нажата правая кнопка мыши. Параметр key в обработчиках OnKeyDown и OnKeyUp определяет виртуальный код нажатой клавиши. Параметр ch в обработчике OnKeyPress определяет нажатый символ.

ОПИСАНИЕ МЕТОДА РЕШЕНИЯ ЗАДАЧИ


Согласно заданию, необходимо построить двумерное изображение заданной фигуры.

Для определения координат вершин фигуры наложим изображение фигуры на сетку (рисунок 2).


Рисунок 2. Определения координат фигуры.
Определив координаты вершин фигуры, заносим их в масивы x и y.

x[1]:=-1; y[1]:= 4;

x[2]:=-3; y[2]:= 4;

x[3]:=-3; y[3]:=-2;

x[4]:= 3; y[4]:=-1;

x[5]:= 3; y[5]:=-3;

После этого рисуется изображение фигуры. Это выполняется процедурой Draw, которая будет описана ниже. Вид окна программы после построения изображения фигуры показан на рисунке 1.

Далее назначается процедура обработки события нажатия кнопки onkeypress:=Vybor;

Это значит, что программа на этом не закачивает работу, а при нажатии любой клавиши будет вызываться процедура Vybor.
procedure Vybor(c:char);

begin

case c of

#49:begin {нажата клавиша 1}

Rotate(pi/18);

{поворот на pi/18 относительно начала координат}

New_XY;

end;

#50:begin {нажата клавиша 2}

Stretch; { растяжение}

New_XY;

end;

#51:begin {нажата клавиша 3}

Compress; { сжатие}

New_XY;

end;

#52:begin {нажата клавиша 4}

MirrorX; { отражение по Х}

New_XY;

end;

#53:begin {нажата клавиша 5}

MirrorY; {отражение по Y}

New_XY;

end;

#54:begin {нажата клавиша 6}

MoveX(0.1); { перемещение по Х}

New_XY;

end;

#55:begin {нажата клавиша 7}

MoveX(-0.1); { перемещение по Y}

New_XY;

end;

#56:begin {нажата клавиша 8}

MoveY(0.1); {перемещение по Y}

New_XY;

end;

#57:begin {нажата клавиша 9}

MoveY(-0.1); { перемещение по Y}

New_XY;

end;

#27:window.close; {нажата клавиша Esc}

end;

end;

В процедуре Vybor в зависимости от кода нажатой клавиши выполняются указанные афинные преобразования. В программе различие между єтими преобразованиями заключаються только в значениях матрицы преобразования.

При нажатии клавиши «1» выполняется поворот фигуры. Для этого матрице преобразования присваивается значение

.

Угол поворота принят 10°. В матрицу вписивается значение конкретніе значения синуса и косинуса даного угла.

При нажатии клавиши «2» выполняется увеличение (растягивание) фигуры. Для этого матрице преобразования присваивается значение

.

При нажатии клавиши «3» выполняется уменьшение (сжатие) фигуры. Для этого матрице преобразования присваивается значение

.

При нажатии клавиши «4» выполняется отражение фигуры относительно оси Х. Для этого матрице преобразования присваивается значение

.

При нажатии клавиши «5» выполняется отражение фигуры относительно оси Y. Для этого матрице преобразования присваивается значение

.

При нажатии клавиши «6» выполняется сдвиг фигуры вправо вдоль оси Х. Для этого матрице преобразования присваивается значение

.

При нажатии клавиши «7» выполняется сдвиг фигуры влево вдоль оси Х. Для этого матрице преобразования присваивается значение

.

При нажатии клавиши «8» выполняется сдвиг фигуры вверх вдоль оси Y. Для этого матрице преобразования присваивается значение

.

При нажатии клавиши «9» выполняется сдвиг фигуры вниз вдоль оси Y. Для этого матрице преобразования присваивается значение

.

Для упрощения программы матрицы преобразования формируются из единичной матрицы. Для задания единичной матрицы используется процедура Ed.

procedure Ed(var T:mtr); { присвоение матрице Т значения единичной }

begin

for var i:=1 to n do

begin

for var j:=1 to n do T[i,j]:=0;

T[i,i]:=1;

end;

end;

Матрица, имя которой передается процедуре как параметр принимает вид

.

Затем в эту матрицу вносятся изменения, в результате чего получаются вышеописанные матрицы. Для этого используются отдельные процедуры.


Клавиша

Код

Действие

Процедура

Параметр

Рисунок

«1»

#49

Поворот

Rotate

угол поворота

4

«2»

#50

Растягивание

Stretch

-

5

«3»

#51

Сжатие

Compress

-

6

«4»

#52

Отражение

MirrorX

-

7

«5»

#53

Отражение

MirrorY

-

8

«6»

#54

Сдвиг вправо

MoveX

dx (сдвиг по Х)

9

«7»

#55

Сдвиг влево

MoveX

dx (сдвиг по Х)

10

«8»

#56

Сдвиг вверх

MoveY

dy (сдвиг по Y)

11

«9»

#57

Сдвиг вниз

MoveY

dy (сдвиг по Y)

12

Esc

#27

Выход из программы

-

-

-



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

procedure New_XY;{расчет новых координат фигуры по предыдущим}

var xb,yb:mas;

begin {с использованием матрицы преобразования R}

for var i:=1 to m do

begin

xb[i]:=x[i]*a[1, 1]+ y[i]*a[1, 2]+ a[1, 3];

yb[i]:=x[i]*a[2, 1]+ y[i]*a[2, 2]+ a[2, 3]

end;

x:=xb;y:=yb;

Draw(x,y);

end;
Для рисования фигуры используется процедура Draw.

procedure Draw(x,y:mas);{рисование фигуры}

begin

clearwindow;

Osi;

setpencolor(clRed);

moveto(xc+round(ms*x[1]),yc-round(ms*y[1]));

lineto(xc+round(ms*x[2]),yc-round(ms*y[2]));

lineto(xc+round(ms*x[3]),yc-round(ms*y[3]));

lineto(xc+round(ms*x[4]),yc-round(ms*y[4]));

lineto(xc+round(ms*x[5]),yc-round(ms*y[5]));

lineto(xc+round(ms*x[1]),yc-round(ms*y[1]));

end;
Процедура сводится к очистке окна, рисованию осей (будет описана ниже), установке красного цвета и последовательному соединению точек, координаты которых заданы в массивах.

Процедура рисования осей и вывода меню:

procedure Osi;{рисование осей координат}

begin

setpencolor(clBlue);

line(0,yc,windowwidth,yc);{оси}

line(xc,0,xc,windowheight);

for var i:=1 to 7 do{максимальное количество засечек в одну сторону}

begin

line(xc-3,yc-round(i*ms),xc+3,yc-round(i*ms));

{засечки на оси У}

line(xc-3,yc+round(i*ms),xc+3,yc+round(i*ms));

{подпись оси У}

str(i,s);

textout(xc-20,yc-round(i*ms),s);

{соответственно засечкам}

textout(xc-25,yc+round(i*ms),'-'+s);

line(xc+round(i*ms),yc-3,xc+round(i*ms),yc+3);

{засечки на оси Х}

line(xc-round(i*ms),yc-3,xc-round(i*ms),yc+3);

{подпись оси Х}

textout(xc+round(i*ms),yc+10,s);

textout(xc-round(i*ms),yc+10,'-'+s);

end;

{центр}

textout(xc+5,yc+10,'0');

{подписи концов осей}

textout(windowwidth-10,yc-10,'X');

textout(xc+5,10, 'Y');

setfontcolor(clGreen);

textout(30,0, 'Поворот - 1');

textout(30,20, 'Растягивание - 2');

textout(30,40, 'Сжатие - 3');

textout(30,60, 'ЗеркалоX - 4');

textout(30,80, 'ЗеркалоY - 5');

textout(30,100,'Вправо - 6');

textout(30,120,'Влево - 7');

textout(30,140,'Вверх - 8');

textout(30,160,'Вниз - 9');

textout(30,180,'Выход - Esc');

end;

Устанавливается синий цвет, рисуются оси, проставляются деления. Также на экран выводится меню, в котором описываются клавиши, с помощью которых управляется программа.

ОПИСАНИЕ ФУНКЦИОНАЛЬНЫХ ВОЗМОЖНОСТЕЙ РАЗРАБОТАННОГО ПРИЛОЖЕНИЯ


Приложение позволяет выполнять заданные аффинные преобразования. Примеры работы программы приведены в приложении 1.

ЗАКЛЮЧЕНИЕ


Согласно заданию составлена программа, листинг которой приведен в придожении 2, примеры работы – в приложении 1.

ПРИЛОЖЕНИЕ 1. ВИД ОКНА ПРОГРАММЫ ПОСЛЕ ВЫПОЛНЕНИЯ НЕКОТОРЫХ ПРЕОБРАЗОВАНИЙ




Рисунок 3. Начальный вид окна программы.



Рисунок 4. Вид окна после выполнения поворота



Рисунок 5. Вид окна после выполнения растягивания



Рисунок 6. Вид окна после выполнения сжатия


Рисунок 7. Вид окна после выполнения отражения относительно оси Х.


Рисунок 8. Вид окна после выполнения отражения относительно оси Y.


Рисунок 9. Вид окна после выполнения сдвига влево.


Рисунок 10. Вид окна после выполнения сдвига вправо.


Рисунок 11. Вид окна после выполнения сдвига вверх.


Рисунок 12. Вид окна после выполнения сдвига вниз.

ПРИЛОЖЕНИЕ 2. ЛИСТИНГ ПРОГРАММЫ


uses graphABC;

const m=5;{точек }

n=3;{размер матриц коэффициентов}

type mas=array[1..m] of real;

mtr=array[1..n,1..n] of real;

var x,y:mas;{фигуры после перемещения}

a:mtr;{матрица преобразований}

xc,yc:integer;{центр экрана }

ms:real;{масштаб для перевода реальных координат в экранные}

s:string;{строка для вывода текста}
procedure Osi;{рисование осей координат}

begin

setpencolor(clBlue);

line(0,yc,windowwidth,yc);{оси}

line(xc,0,xc,windowheight);

for var i:=1 to 7 do{максимальное количество засечек в одну сторону}

begin

line(xc-3,yc-round(i*ms),xc+3,yc-round(i*ms));{засечки на оси У}

line(xc-3,yc+round(i*ms),xc+3,yc+round(i*ms));

{подпись оси У}

str(i,s);

textout(xc-20,yc-round(i*ms),s);{соответственно засечкам}

textout(xc-25,yc+round(i*ms),'-'+s);

line(xc+round(i*ms),yc-3,xc+round(i*ms),yc+3); {засечки на оси Х}

line(xc-round(i*ms),yc-3,xc-round(i*ms),yc+3);

{подпись оси Х}

textout(xc+round(i*ms),yc+10,s);

textout(xc-round(i*ms),yc+10,'-'+s);

end;

{центр}

textout(xc+5,yc+10,'0');

{подписи концов осей}

textout(windowwidth-10,yc-10,'X');

textout(xc+5,10, 'Y');

setfontcolor(clGreen);

textout(30,0, 'Поворот - 1');

textout(30,20, 'Растягивание - 2');

textout(30,40, 'Сжатие - 3');

textout(30,60, 'ЗеркалоX - 4');

textout(30,80,'ЗеркалоY - 5');

textout(30,100,'Вправо - 6');

textout(30,120,'Влево - 7');

textout(30,140,'Вверх - 8');

textout(30,160,'Вниз - 9');

textout(30,180,'Выход - Esc');

end;

uses graphABC;

const m=5;{точек }

n=3;{размер матриц коэффициентов}

type mas=array[1..m] of real;

mtr=array[1..n,1..n] of real;

var x,y:mas;{фигуры после перемещения}

a:mtr;{матрица преобразований}

xc,yc:integer;{центр экрана }

ms:real;{масштаб для перевода реальных координат в экранные}

s:string;{строка для вывода текста}
procedure Osi;{рисование осей координат}

begin

setpencolor(clBlue);

line(0,yc,windowwidth,yc);{оси}

line(xc,0,xc,windowheight);

for var i:=1 to 7 do{максимальное количество засечек в одну сторону}

begin

line(xc-3,yc-round(i*ms),xc+3,yc-round(i*ms));{засечки на оси У}

line(xc-3,yc+round(i*ms),xc+3,yc+round(i*ms));

{подпись оси У}

str(i,s);

textout(xc-20,yc-round(i*ms),s);{соответственно засечкам}

textout(xc-25,yc+round(i*ms),'-'+s);

line(xc+round(i*ms),yc-3,xc+round(i*ms),yc+3); {засечки на оси Х}

line(xc-round(i*ms),yc-3,xc-round(i*ms),yc+3);

{подпись оси Х}

textout(xc+round(i*ms),yc+10,s);

textout(xc-round(i*ms),yc+10,'-'+s);

end;

{центр}

textout(xc+5,yc+10,'0');

{подписи концов осей}

textout(windowwidth-10,yc-10,'X');

textout(xc+5,10, 'Y');

setfontcolor(clGreen);

textout(30,0, 'Поворот - 1');

textout(30,20, 'Растягивание - 2');

textout(30,40, 'Сжатие - 3');

textout(30,60, 'ЗеркалоX - 4');

textout(30,80,'ЗеркалоY - 5');

textout(30,100,'Вправо - 6');

textout(30,120,'Влево - 7');

textout(30,140,'Вверх - 8');

textout(30,160,'Вниз - 9');

textout(30,180,'Выход - Esc');

end;
procedure Draw(x,y:mas);{рисование фигуры}

begin

clearwindow;

Osi;

setpencolor(clRed);

moveto(xc+round(ms*x[1]),yc-round(ms*y[1]));

lineto(xc+round(ms*x[2]),yc-round(ms*y[2]));

lineto(xc+round(ms*x[3]),yc-round(ms*y[3]));

lineto(xc+round(ms*x[4]),yc-round(ms*y[4]));

lineto(xc+round(ms*x[5]),yc-round(ms*y[5]));

lineto(xc+round(ms*x[1]),yc-round(ms*y[1]));

end;
procedure Ed(var T:mtr); { присвоение матрице Т значения единичной }

begin

for var i:=1 to n do

begin

for var j:=1 to n do T[i,j]:=0;

T[i,i]:=1;

end;

end;
procedure Stretch; {расчет матрицы А для растягивания фигуры}

begin

Ed(a);

a[2,2]:=1.05;{коэффициент растяжения}

a[1,1]:=1.05;

end;
procedure Compress; {расчет матрицы А для сжатия фигуры}

begin

Ed(a);

a[2,2]:=0.95;{коэффициент растяжения}

a[1,1]:=0.95;

end;
procedure MirrorX; {расчет матрицы А для отражения фигуры по Х}

begin

Ed(a);

a[2,2]:=-1;

end;
procedure MirrorY; {расчет матрицы А для отражения фигуры по Х}

begin

Ed(a);

a[1,1]:=-1;

end;
procedure MoveY(dy:real); {расчет матрицы А для перемещения фигуры по Y}

begin

Ed(a);

a[2,3]:=dy;

end;
procedure MoveX(dx:real); {расчет матрицы А для перемещения фигуры по Y}

begin

Ed(a);

a[1,3]:=dx;

end;
procedure Rotate(u:real);

var c, s: real;

begin

Ed(a);

c:=cos(u); a[1,1]:= c; a[2,2]:=c;

s:=sin(u); a[1,2]:=-s; a[2,1]:=s;

end;
procedure New_XY;{расчет новых координат фигуры по предыдущим}

var xb,yb:mas;

begin {с использованием матрицы преобразования А}

for var i:=1 to m do

begin

xb[i]:=x[i]*a[1, 1]+ y[i]*a[1, 2]+ a[1, 3];

yb[i]:=x[i]*a[2, 1]+ y[i]*a[2, 2]+ a[2, 3]

end;

x:=xb;y:=yb;

Draw(x,y);

end;
procedure Vybor(c:char);

begin

case c of

#49:begin {нажата клавиша 1}

Rotate(pi/18); {поворот на pi/18 относительно начала координат}

New_XY;

end;

#50:begin {нажата клавиша 2}

Stretch; { растяжение}

New_XY;

end;

#51:begin {нажата клавиша 3}

Compress; { сжатие}

New_XY;

end;

#52:begin {нажата клавиша 4}

MirrorX; { отражение по Х}

New_XY;

end;

#53:begin {нажата клавиша 5}

MirrorY; {отражение по Y}

New_XY;

end;

#54:begin {нажата клавиша 6}

MoveX(0.1); { перемещение по Х}

New_XY;

end;

#55:begin {нажата клавиша 7}

MoveX(-0.1); { перемещение по Y}

New_XY;

end;

#56:begin {нажата клавиша 8}

MoveY(0.1); {перемещение по Y}

New_XY;

end;

#57:begin {нажата клавиша 9}

MoveY(-0.1); { перемещение по Y}

New_XY;

end;

#27:window.close; {нажата клавиша Esc}

end;

end;
begin

xc:=windowwidth div 2;

yc:=windowheight div 2; { центр экрана }

ms:=(yc-30)/5; {масштаб}

{зададим координаты вершин фигуры}

x[1]:=-1; y[1]:= 4;

x[2]:=-3; y[2]:= 4;

x[3]:=-3; y[3]:=-2;

x[4]:= 3; y[4]:=-1;

x[5]:= 3; y[5]:=-3;

Draw(x,y);{исходный}

onkeypress:=Vybor;

end.






написать администратору сайта