Здавалка
Главная | Обратная связь

Задание на выполнение работы



 

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

2) Записать полную программу для примера 2, используя для инициализации графики модуль <zaggraf.c>,произвести отладку программы и запустить в работу.

3) Составить программу для зарисовки графического объекта, представленного на рис.14.

4) Нарисовать закрашенный эллипс.

5) Нарисовать закрашенный столбик bar3d().

 

Указания для построения

 

Координаты прямоугольника (rectangle):10,10,639,349,цвет любой.

Координаты закрашенного прямоугольника (bar):50,50,300,300.

Координаты окна (setvievport()):100,100,200,200.

В окно вписать несколько десятков концентрических окружностей, заполняющих все пространство окна.

Надпись над рисунком сделать с привязкой по центру шрифтом TRIPLEX_FONT.

 

 

Рис.14

 

 

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

 

1) Полные программы для рисования трех объектов.

2) Результаты построений.

 

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

 

1) Назовите основные “рисующие функции”

2) Перечислите аргументы функции rectangle().

3) В чем состоит различие функций bar() и bar3d()?

4) Назовите основные функции вывода текстовой информации в графическом режиме. 5) Как производится изображение букв в графическом режиме?

 

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

 

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

 

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

 

Содержание работы

 

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

Примером применения рекурсии является построение вложенных треугольников. Для этой цели будем использовать программу построения треугольников TRIA, описанную в работе №1. Вычертим один треугольник с вершинами А, В, С, координаты которых: xA, yA, xB, yB, xC, yC, но затем снова вызовем функцию TRIA с координатами средних точек его сторон:

xP=(xB+xC)/2, yP=(yB+yC)/2; xQ=(xC+xA)/2; yQ=(yC+yA)/2; xR=(xA+xB)/2; yR=(yA+yB)/2. Так, что внутри треугольника появятся четыре малых треугольника (Рис.15) Затем функция вызовет самою себя с координатами вершин малых треугольников в качестве аргументов.

Данный процесс может быть проверен n раз. Число n называется глубиной рекурсии и включается в качестве аргумента в функцию. Например, если пользователь задает n=7, то аргумент функции устанавливается равным n-1 для каждого рекурсивного обращения, т.е. при достижении самого «глубокого уровня рекурсии» значение n становится равным нулю, что приводит к немедленному возврату в вызывающую функцию, т.е. в саму функцию TRIA с рекурсией приведена в приложении.

Рис.15

Следующим примером использования рекурсии является получение линейного рисунка, известного под именем кривой Гильберта. Эта кривая основана на изображении буквы П, вычерченной в виде трех сторон квадрата как показано на рис.16. Существуют кривые Гильберта порядков 1,2,..., обозначаемые как Н1,Н2,.... Фигура Н2 получается из четырех фигур Н1, соединенных связками (толстые линии). В действительности все линии одинаковой толщины. Мы видим, что Н2 можно рассматривать как большую букву П, четыре части которой заменены меньшими по размеру буквами П. Эти меньшие буквы П соединены тремя связками. Каждая сторона меньшей буквы П имеет ту же длину, что и связка. Они в три раза меньше стороны квадрата, в который впиcывается H2.

           
     


 

 

           
     
 

 


H1 H2

 

 

       
   


Рис.16

Применим ту же процедуру к каждой из четырех букв П, составляющих Н2, т.е. каждую букву П в Н2 заменим меньший Н2, одновременно уменьшим длину связок так, чтобы их длины стали равными длине элементарного отрезка прямой линии, которые содержатся в трех малых фигурах Н2, т.е. мы получили фигуру Н3 (рис.17).

Теперь все элементарные отрезки в семь раз меньше, чем длина сторон квадрата, в который вписывается фигура Н3. Отсюда получаем, что коэффициенты уменьшения для этих элементарных отрезков в фигурах Н1,Н2,Н3,..., образуют ряд чисел 1,3,7,...., т.е. в общем случае коэффициенты уменьшения для фигуры Нn может быть вычислен по формуле .

Рис.17 Заметим, что связки в фигуре Н2 вычерчиваются в тех же направлениях, как и три отрезка, образующих букву П в фигуре Н1.

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

Рассмотрим формирование рекурсивной функци Hilbert со следующими

аргументами:

- координаты точек А, В, С (см рис.18);

- горизонтальные и вертикальные компоненты двух направленных связок, причем

одна лежит на отрезке АВ, а другая на отрезке АС.

 

 
 


J

C

H K

G L

F

D B

A

 

Рис.18

Они задаются в виде векторов, т.е. как пара чисел (dx, dy), которые могут

принимать положительные, отрицательные и нулевые значения, в зависимости от

относительного положения точек А, В, С. Эти два вектора обозначим как dAB и

dAC, а глубину рекурсии - за n. При n=0 функция ничего делать не будет.

Будем считать, что рис.7 является вариацией изображения буквы П, повернутой на угол 300 против часовой стрелки, позиция которой определяется тремя заданными точками А,В и С. Будем считать ,что точка А является начальной, а точка В -конечной. Основной причиной задания точки С является необходимость указания с какой стороны от направленного отрезка АВ должна лежать вычерчиваемая кривая.

Оба заданных вектора связок dAB и dAC отмечены на рис.19 в виде связок в трех местах, а именно, как отрезки DF, GH и IK. Три заданные точки А, В, С и два заданных вектора dAB и dAC позволяют определить позиции точек D, E, F, G, H, I, J, K на рис7. В общем случае пунктирные линии на рис.7 не вычерчиваются. Вместо этого будем выполнять рекурсивное обращение к функции Hilbert для каждой из четырех букв П. Для вычерчивания трех отрезков связок DF, GH, IK будем обращаться к функции Draw() или lineto().

Функция Hilbert и использующая ее функция sguare() приведена в приложении.

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

 

Допустим, что наибольшая окружность имеет радиус r. Тогда остальные три окружности будут иметь радиусы . Радиус наибольшей орбиты вычисляется как R=cr. Центры наибольшей окружности и следующей за ней лежат на расстоянии R друг от друга. Тогда будут радиусами других орбит. Это означает, что расстояние между центрами самой внутренней (наибольшей) окружности и самой внешней (наименьшей) окружности равно: .

Рис.19

Поскольку для вычисления значений радиуса R нам необходимо соотнести это выражение с доступным полем на экране, то мы должны учесть размеры и самой маленькой окружности. Она хоть и маленькая, но все-таки имеет определенные размеры, следует добавить к выше приведенному ряду. Самым простейшим способом решения этой проблемы будет добавление следующего члена ряда, что означает отведения места для следующей орбиты, как если бы было на единицу больше. Следовательно, если n=4, то будем использовать ряд: .

В общем случае это расстояние равно:

Поскольку меньше, чем то важно, чтобы сумма S была не больше, чем . Из этого следует, что радиусы R и r для наибольшей орбиты и наибольшей окружности соответственно должны быть вычислены как:

где .

 

Описанные выше приемы создания рекурсивных изображений могут быть применены к другим фигурам, например квадратам, звездам и т.д.

 

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.