РЕАЛИЗАЦИЯ ДВУМЕРНЫХ АФФИННЫХ ПРЕОБРАЗОВАНИЙ. ЛР2. Томский государственный университет систем
Скачать 476 Kb.
|
Министерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР) Факультет систем управления Кафедра АСУ РЕАЛИЗАЦИЯ ДВУМЕРНЫХ АФФИННЫХ ПРЕОБРАЗОВАНИЙ Отчет о выполнении лабораторной работы №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Управление графическим окном
После запуска PascalABC, по умолчанию, запускается текстовый режим. Для работы с графикой служит отдельное графическое окно. Чтобы его открыть, необходимо подключить модуль GraphABC. В этом модуле содержится набор процедур и функций, предназначенных для работы с графическим экраном, а также некоторые встроенные константы и переменные, которые могут быть использованы в программах с графикой. С их помощью можно создавать разнообразные графические изображения и сопровождать их текстовыми надписями. Подключение осуществляется в разделе описаний. Формат подключения модуля GraphABC: Uses GraphABC; Графический экран PascalABC (по умолчанию) содержит 640 точек по горизонтали и 400 точек по вертикали. Начало отсчета – левый верхний угол экрана. Ось x направлена вправо, а ось y –вниз. Координаты исчисляются в пикселях. Все команды библиотеки GraphABC являются подпрограммами и описаны в виде процедур и функций. Для того, что бы команда выполнилась необходимо указать команду и задать значения параметров. Процедуры рисования графических примитивов
Процедуры, используемые для работы с цветом
Процедуры для работы с текстом
Цвета в 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; Матрица, имя которой передается процедуре как параметр принимает вид . Затем в эту матрицу вносятся изменения, в результате чего получаются вышеописанные матрицы. Для этого используются отдельные процедуры.
Далее вызывается процедура 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. |