Использование рекурсии в компьютерной графике

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 13.02.2014
Размер файла 422,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

БИРСКИЙ ФИЛИАЛ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

БАШКИРСКОГО ГОССУДАРСТВЕННОГО УНИВЕРСИТЕТА

Физико - математический факультет

Кафедра информатики и информационных технологий в образовании

Курсовая работа

на тему: Использование рекурсии в компьютерной графике

Выполнил: студент 2 курса ОЗО

Научный руководитель:

Царькова О.М.

Бирск - 2012

Содержание

Введение

Глава 1. Теоретическая часть

1.1 Структура рекурсивных процедур и функций

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

1.3 Фракталы

Глава 2. Разработка программ

2.1 Пример 1

2.2 Пример 2

2.3 Пример 3

2.4 Пример 4

Заключение

Литература

Введение

рекурсия фрактал алгоритм pascal

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

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

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

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

Задачи данной курсовой работы:

· рассмотреть примеры компьютерной графики с использованием рекурсии,

· составить алгоритмы рисования фракталов на языке программирования PascalABC, создать их приложения.

Глава I. Теоретическая часть

1.1 Структура рекурсивных процедур и функций

Структура описания рекурсивных процедур (функций) имеет следующий вид:

<действия на входе в рекурсию>;

if <условие> then

<действия выхода из рекурсии>

else <вызов процедуры (функции) с другими параметрами>

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

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

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

Пример 1. Разработаем программу которая рисует изображение, представленное на следующем рисунке:

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

описать процедуру изображения одной окружности с четырьмя окружностями поменьше;

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

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

procedure krug(x,y,r,stepN,stepMax:integer);

begin {вычисляем координаты центра i-й окружности};

krug(x+r,y,r div 2);

krug(x,y+r,r div 2);

krug(x-r,y,r div 2);

krug(x,y-r,r div 2);

Arc(x,y,r,0,360); {рисуем окружность с центром в точке (х,у) и радиусом r}

end;

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

Если осуществить вызов этой же процедуры из основной программы с начальными параметрами, то рекурсивные вызовы никогда не закончатся и программа будет работать бесконечно. Для того, чтобы этого не случилось, можно ввести в качестве аргумента процедуры некоторую величину stepN, которая при каждом новом вызове процедуры будет увеличиваться на 1, а в тело процедуры что его операторы должны выполняться только при stepMax>stepN, то есть это условие должно играть роль своеобразной «заглушки», ограничивающей число вызовов.

Ниже приведена программа, полностью решающая поставленную задачу.

В основной программе запрашиваются число уровней stepMax. Центр самой окружности располагается в центре экрана.

uses crt,graphABC;

Var stepMax, x, y, r : integer;

procedure krug(x,y,r,stepN,stepMax:integer);

begin

if stepMax>stepN then

begin {задаём координаты окружностей а так же их размеры}

krug(x+r,y,r div 2, stepN+1, stepMax);

krug(x,y+r,r div 2, stepN+1, stepMax);

krug(x-r,y,r div 2, stepN+1, stepMax);

krug(x,y-r,r div 2, stepN+1, stepMax);

end;

Arc(x,y,r,0,360); {получаем окружноть}

end;

begin {начало основной программы}

read(stepMax);

x:=700; {начальные координаты}

y:=1000;

r:=90; {начальный радиус}

SetWindowSize(700,700); {размер графического окна}

krug(WindowWidth div 2, WindowHeight div 2{ Размещаем рисунок в центре графического окна

}, r, 0, stepMax);

end.

Изменяя в процессе демонстрации работы программы stepmax можно получать множество привлекательных рисунков.

Пример 2. Так же немного изменив процедуру krug можно получить рисунки такого вида:

A B

Получаем рисунок А:

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

uses crt,graphABC;

var stepMax,x,y,r,i:integer;

procedure krug(x,y,r,stepN,stepMax:integer);

begin

if stepMax>stepN then

begin

krug(x+r,y,r*3 div 5, stepN+1, stepMax);

krug(x-r,y,r*3 div 5, stepN+1, stepMax);

end;

Arc(x,y,r,0,360);

end;

begin

write('[фигуру какого порядка следует нарисовать]','_');

read(stepMax);

clearwindow;

write('[введите желаемый радиус]','_'); read(r);

clearwindow;

writeln (' ','на экране окружности ' ,stepMax, ' го',' порядка');

stepMax:=stepMax-1;

x:=600;

y:=400;

SetWindowSize(1000,1000);

krug(WindowWidth div 2,WindowHeight div 2,r,0,stepMax);

end.

Получаем рисунок В:

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

uses crt, graphABC, events;

var

k,x,y,r:integer;

procedure krug(x,y,r,stepN,stepMax:integer);

begin

if stepMax>stepN then

begin

krug(x+r,y,r div 2, stepN+1, stepMax);

end;

Arc(x,y,r,0,360);

end;

begin

read(k);

read(r);

k:=k-1;

x:=700;

y:=1000;

SetWindowSize(700,700);

krug(WindowWidth div 2,WindowHeight div 2,r,0,k);

end.

1.3 Фракталы

Пример 1. Кривые Гильберта

Этот узор состоит из суперпозиции пяти кривых. Три наложенные друг на друга кривые имеют форму Н1, Н2 и Н3.

Нi+1 получается соединением четырех экземпляров Нi вдвое меньшего размера, повернутых соответствующим образом и "стянутых" вместе тремя прямыми линиями. Н1 можно считать состоящей из четырех вхождений пустой Н0, соединенных этими же тремя линиями. Кривая Нi называется кривой Гильберта i-го порядка в честь ее первооткрывателя Д.Гильберта.

Каждая кривая Нi состоит из четырех вдвое меньших Нi-1, то процедура для рисования Нi будет включать четыре обращения для рисования Нi-1, соответствующим образом повернутых и уменьшенных вдвое. Обозначим эти четыре части через А, В, С и D.

Это кривые Гильберта 1-го порядка.

Соединительные прямые будем обозначать стрелками, указывающими в соответствующем направлении. Будем предполагать, что направление задается целым параметром i как i·45 градусов.

Тогда получаем:

Для построения A, B, С, D получается следующая схема рекурсий:

Кривые Гильберта 2-го порядка.

Для рисования линии будем использовать процедуру: Line( i, s: integer), где i - направление, s - длина отрезка.

procedure Line( i, s: integer);

begin

x:=i*45/180*pi;

LineTo(PenX{текущие координаты} + Round(s*cos(x)), PenY + Round(s*sin(x)));

end;

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

процедуру, соответствующую схеме А:

Procedure A(i, s: integer);

begin

if i>0 then

begin

D(i-1,s); Line(4,s);

A(i-1,s); Line(6,s);

A(i-1,s); Line(0,s);

B(i-1,s);

end;

end;

Аналогично составляются процедуры для В, С, D. Процедура А инициируется главной программой по одному разу аждой из кривых Гильберта. Главная программа определяет начальную точку кривой, т.е. исходные координаты (x0,y0) и начальное значение длины отрезка u (желательно, чтобы u=2n).

Эта программа рисует кривые Гильберта 5-го порядка.

Uses Crt, Graphabc;

Var i,x0,y0,u : integer;

x : Real;

procedure Line( i, s: integer);

begin

x:=i*45/180*pi;

LineTo(PenX+ Round(s*cos(x)), PenY + Round(s*sin(x)));

END;

Procedure B(i, s: integer);forward;

Procedure C(i, s: integer);forward;

Procedure D(i, s: integer);forward;

Procedure A(i, s: integer);

begin

if i>0 then

begin

D(i-1,s); Line(4,s);

A(i-1,s); Line(6,s) ;

A(i-1,s); Line(0,s);

B(i-1,s);

end;

end;

Procedure B(i, s: integer);

begin

if i>0 then

begin

C(i-1,s); Line(2,s);

B(i-1,s); Line(0,s);

B(i-1,s); Line(6,s);

A(i-1,s);

end;

end;

Procedure C(i, s: integer);

begin

if i>0 then

begin

B(i-1,s); Line(0,s);

C(i-1,s); Line(2,s);

C(i-1,s); Line(4,s);

D(i-1,s);

end;

end;

Procedure D(i, s: integer);

begin

if i>0 then

begin

A(i-1,s); Line(6,s);

D(i-1,s); Line(4,s);

D(i-1,s); Line(2,s);

C(i-1,s);

end;

end;

begin

SetWindowSize(700,540);

write (' ','КРИВЫЕ ГИЛЬБЕРТА');

begin

x0:=400; y0:=350;{координаты начала рисования} u:=128{длина отрезка}; i:=1;

while i<=5 {задаем порядок} do

begin

MoveTo(x0,y0); {задаем координаты пера}

A(i,u); i:=i+1; u:=u div 2;

x0:=x0+(u div 2); y0:=y0+(u div 2);

end;

end;

end.

Пример 2. Кривые Серпинского

Аналогично, путем наложения друг на друга нескольких кривых, получается рисунок из кривых Серпинского. Первые две из них С1 и С2 показаны ниже:

Главное отличие кривой Серпинского от кривой Гильберта в том, что первая кривая замкнута. Значит, основная рекурсивная схема должна давать разомкнутую кривую, четыре части которой соединяются линиями, не принадлежащими самому рекурсивному образу. Четыре составляющих образа обозначим через A, B, C, D

Соединительные прямые будем обозначать стрелками, указывающими в соответствующем направлении. Будем предполагать, что направление задается целым параметром i как i·45 градусов. Кроме направлений, описанных в предыдущем примере, понадобятся еще:

Основной образ кривых Серпинского задается схемой:

Рекурсивные составляющие по схемам:

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

begin

if i>0 then

begin

A(i-1,s); Line(7,s);

B(i-1,s); Line(0,2*s);

D(i-1,s); Line(1,s);

A(i-1,s);

end;

end;

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

Эта программа рисует кривые Серпинского 4-го порядка.

Uses Crt, Graphabc;

Var x0,y0,u,i : integer;

X : Real;

procedure Line( i, s: integer);

begin

x:=i*45/180*pi;

LineTo(PenX{текущие координаты} + Round(s*cos(x)), PenY + Round(s*sin(x)));

end;

Procedure B(i, s: integer);forward;

Procedure C(i, s: integer);forward;

Procedure D(i, s: integer);forward;

procedure A(i,s: integer);

begin

if i>0 then

begin

A(i-1,s); Line(7,s);

B(i-1,s); Line(0,2*s);

D(i-1,s); Line(1,s);

A(i-1,s);

end;

end;

Procedure B(i, s: integer);

begin

if i>0 then

begin

B(i-1,s); Line(5,s);

C(i-1,s); Line(6,2*s);

A(i-1,s); Line(7,s);

B(i-1,s);

end;

end;

Procedure C(i, s: integer);

begin

if i>0 then

begin

C(i-1,s); Line(3,s);

D(i-1,s); Line(4,2*s);

B(i-1,s); Line(5,s);

C(i-1,s);

end;

end;

Procedure D(i, s: integer);

begin

if i>0 then

begin

D(i-1,s); Line(1,s);

A(i-1,s); Line(2,2*s);

C(i-1,s); Line(3,s);

D(i-1,s);

end;

end;

begin

SetWindowSize(900,1000);

write (' ', 'КРИВЫЕ СЕРПИНСКОГО ЧЕТВЁРТОГО ПОРЯДКА');

x0:=120; y0:=700; {координаты начала рисования} u:=13; i:=1;

for i:=1 to 4 do begin

MoveTo(x0,y0);

A(i,u); Line(7,u);

B(i,u); Line(5,u);

C(i,u); Line(3,u);

D(i,u); Line(1,u);

end;

end.

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

Глава 2. Разработка программ

2.1 Пример 1

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

Анализ изображения: на рисунке большой квадрат со вписанными в него квадратами меньшего размера. Причём, каждый вписанный квадрат имеет свои координаты, которые вычисляются по координатам описанного квадрата. Всего изображено 6 уровней квадратов. Для того, чтобы составить программу построения этого изображения, можно:

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

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

Опишем алгоритм рисования:

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

Для рисования квадратов будем использовать линии определенной длины. При этом надо задавать координаты каждой линии (x1,y1), (x2,y2). Для этого будем использовать параметры графического окна:

xc:=WindowWidth div 2; {возвращаем ширину графического окна}

yc:=WindowHeight div 2; {возвращаем высоту - // - // - }

ax:=xc-a; ay:=yc-a; {находим координаты для первой линии}

bx:=xc+a; by:=yc-a; {находим координаты для второй линии}

cx:=xc+a; cy:=yc+a; {находим координаты для третьей линии}

dx:=xc-a; dy:=yc+a; {находим координаты для четвертой линии}

где а - длина линии.

function Kvad(xc,yc,a:integer; ax,ay,bx,by,cx,cy,dx,dy,m:real; n:integer) :integer;

begin

if n=0 then Kvad:=0

else

begin {координаты линий округляем}

line(round(ax),round(ay),round(bx),round(by));

line(round(bx),round(by),round(cx),round(cy));

line(round(cx),round(cy),round(dx),round(dy));

line(round(dx),round(dy),round(ax),round(ay));

dec(n); {уменьшаем n на 1}

Рекурсивный вызов функции и вычисление новых значений производится так:

Kvad:=Kvad(xc, yc, a, ax+(bx-ax)*m, ay+(by-ay)*m, bx+(cx-bx)*m, by+(cy-by)*m,cx+(dx-cx)*m, cy+(dy-cy)*m, dx+(ax-dx)*m, dy+(ay-dy)*m, m, n);

end;

end;

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

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

Если осуществить вызов этой же функции из основной программы с начальными параметрами, то рекурсивные вызовы никогда не закончатся и программа будет работать бесконечно. Для того, чтобы этого не случилось, можно ввести в качестве аргумента функции некоторую величину n, которая при каждом новом вызове процедуры будет уменьшаться на 1 (применяем dec(n)), а в тело функции что его операторы должны выполняться только при n<>0, то есть это условие должно играть роль своеобразной «заглушки», ограничивающей число вызовов.

2.2 Пример 2

Рекурсия может быть использована для получения линейного рисунка, например «дерева»

Uses Crt, Graphabc;

Var x, fi : Real;

i, x0, y0, u, divisor : integer;

Для рисования линии будем использовать процедуру: Line( i, s: integer), где i - направление, s - длина отрезка.

procedure Line( i, s: integer);

begin

x:=(i*fi-90)*pi/180;

LineTo(PenX{текущие координаты}+ Round(s*cos(x)), PenY + Round(s*sin(x))); {рисуем линию под определенным углом}

end;

procedure A(i,s,k, kmax: integer); //k - шаг рекурсии, kmax - порядок рекурсии

var cX, cY: integer; //координаты разветвления

begin

Line(i,s); //рисуем ножку ветви

if k<kmax then

begin

cX:= PenX; //запоминаем координаты ветвления

cY:= PenY;

A(i,s div divisor,k+1,kmax); //рисуем среднюю ветвь

MoveTo(cX,cY);

A(i-1,s div divisor,k+1,kmax); //рисуем левую ветвь

MoveTo(cX,cY);

A(i+1,s div divisor,k+1,kmax); //рисуем правую ветвь

end

else

begin

Line(i,s); //если рекурсия окончена, дорисовываем ветку

end;

end;

begin

read(i); //порядок рекурсии

SetWindowSize(700,640);

x0:=330; //начальные координаты

y0:=500;

u:=243; //длина самой крупной ножки

divisor:=3; //во сколько раз длина ветки на следующем шаге меньше, чем

на предыдущем.

fi:=70; //угол между ветвями

MoveTo(x0,y0); //переходим к начальным координатам

A(0,u,0,i); //рисуем ветку

end.

2.3 Пример 3

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

uses crt,graphABC,events;

var k,x,y,r,stepMax:integer;

напишем процедуру krug которая рисует окружность и вписывает в нее семь окружностей меньщего размера:

procedure krug(x,y,r,stepN,stepMax:integer); {stepN,stepMax играют роль заглушки}

var nr:integer;

begin

if stepMax>stepN then

begin

circle(x,y,r); {рисуем основной круг}

nr:=r div 3; {вычисляем радиус для следующего шага}

krug(x,y,nr, stepN+1, stepMax); {рисуем центральный круг}

krug(x,y+2*nr,nr, stepN+1, stepMax); {рисуем нижний круг}

krug(x,y-2*nr,nr, stepN+1, stepMax); {рисуем верхний круг}

krug(x+2*round(nr*sin(2*PI/3)),y+nr,nr, stepN+1, stepMax); {круг с права}

krug(x-2*round(nr*sin(2*PI/3)),y+nr,nr, stepN+1, stepMax); {круг с лева}

krug(x+2*round(nr*sin(2*PI/3)),y-nr,nr, stepN+1, stepMax); {круг с права}

krug(x-2*round(nr*sin(2*PI/3)),y-nr,nr, stepN+1, stepMax); {круг с лева}

end;

end;

begin

write('[фигуру какого порядка следует нарисовать]','_');read(stepMax);

clearwindow;

write('[введите желаемый радиус]','_'); read(r);

clearwindow;

write (' ','на экране окружности ' ,stepMax, ' го',' порядка');

x:=350; {начальные координаты}

y:=400;

SetWindowSize(700,700); {размер графического окна}

krug(x,y,r,0,stepMax); {вызов процедуры}

end.

2.4 Пример 4

Разработаем программу, строящую на экране компьютера изображение описанных кругов.

uses crt,graphABC,events;

var

stepMax,x,y,r:integer;

напишем процедуру krug которая рисует окружность и описывает её шестью окружностями меньщего размера:

procedure krug(x,y,r,stepN,stepMax:integer);

var nr:integer;

begin

if stepMax>stepN then

begin

circle(x,y,r); {рисуем основной круг}

Вычисляем центр каждого круга:

krug(x+round(2*r),y, r div 3, stepN+1, stepMax); {круг с права}

krug(x-round(2*r),y, r div 3, stepN+1, stepMax); {круг с лева}

krug(x+round(2*r*cos(PI/3)),y-round(2*r*sin(PI/3)),r div 3, stepN+1, stepMax); {верхний правый круг}

krug(x-round(2*r*cos(PI/3)),y-round(2*r*sin(PI/3)),r div 3, stepN+1, stepMax); {левый верхний круг}

krug(x+round(2*r*cos(PI/3)),y+round(2*r*sin(PI/3)),r div 3, stepN+1, stepMax); {нижний правый круг}

krug(x-round(2*r*cos(PI/3)),y+round(2*r*sin(PI/3)),r div 3, stepN+1, stepMax); {нижний левый круг}

end;

end;

begin

write('[фигуру какого порядка следует нарисовать]','_');

read(stepMax);

clearwindow;

write('[введите желаемый радиус]','_'); read(r);

clearwindow;

writeln (' ','на экране окружности ' ,stepMax, ' го',' порядка');

x:=350; {начальные координаты}

y:=400;

SetWindowSize(700,700);

krug(x,y,r,0,stepMax); {вызываем процедуру krug }

end.

Дерево рекурсивных вызовов

Проанализируем пример 3:

Для получения окружнотси со вписанными окружностями (второго порядка) трдебуется сделать следующие действия:

Шаг 1.

procedure krug(x,y,r,stepN,stepMax:integer);

var nr:integer;

begin

if stepMax>stepN then

begin

circle(x,y,r);

end;

end;

Шаг 2.

Вычислим радиус для следующей окружности: nr:=r div 3;

Вызываем в процедуре krug ещё одну процедуру krug и передаём ей новые параметры:

krug(x,y,nr, stepN+1, stepMax); получаем:

окружность в центре которого ещё одна окружность.

Шаг 3.

Добавляем в основную процедуру krug вторую процедуру krug со следующими параметрами:

krug(x,y+2*nr,nr, stepN+1, stepMax); передвигаемся по игрику

Шаг 4.

Добавляем третью процедуру krug : krug(x,y-2*nr,nr, stepN+1, stepMax);

Шаг 5.

Добавляем четвертую процедуру krug:

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

krug(x+2*round(nr*sin(2*PI/3)),y+nr,nr, stepN+1, stepMax);

Шаг 6.

Аналогично добавляем пятую процедуру krug:

krug(x-2*round(nr*sin(2*PI/3)),y+nr,nr, stepN+1, stepMax);

Шаг 7.

Добавляем шестую процедуру krug:

krug(x+2*round(nr*sin(2*PI/3)),y-nr,nr, stepN+1, stepMax);

Шаг 8.

Добавляем седьмую процедуру krug:

krug(x-2*round(nr*sin(2*PI/3)),y-nr,nr, stepN+1, stepMax);

получаем конечный результат:

«Заглушка» срабатывает когда stepN становится больше stepMax

При каждом повторе процедуры krug, stepN увеличивается на единицу.

Проанализируем пример 1:

Заключение

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

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

Литература

1. http://web-pascal.narod.ru/stat/recurs.htm

2. http://it.kgsu.ru

3. http://ru.wikipedia.org

4. http://tvd-home.ru/recursion

5. http://pascal.helpov.net

6. Златопольский Д.М. Рекурсия. Информатика, 1996

7. Островский С.Л., Гольдшлаг О.Я. Фрактальные кривые. Информатика, 1995

Размещено на Allbest.ru

...

Подобные документы

  • Использование рекурсии в предметных областях. Рекурсивные процедуры и функции в программировании. Создание алгоритмов для рисования графических изображений с использованием рекурсии в среде программирования Pascal ABC. Примеры рекурсии в графике.

    творческая работа [6,7 M], добавлен 01.02.2014

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

    курсовая работа [432,2 K], добавлен 16.01.2013

  • Изучение основных алгоритмов генерации различных видов фракталов. Выбор языка и среды программирования. Характеристика структурных элементов растрового графического редактора фракталов. Описание интерфейса приложения, порядок редактирования изображений.

    курсовая работа [1,2 M], добавлен 04.04.2014

  • Классификация основных фракталов: алгебраические, геометрические и стохастические. Рассмотрение нескольких распространённых видов фракталов: решетка и треугольник Серпинского, крива Коха, фрактал и множество Мандельброта, кривая Дракона и модель Джулии.

    курсовая работа [735,1 K], добавлен 11.02.2015

  • Определение и классификация фракталов. Геометрические, стохастические, алгебраические их виды. Множество Мандельброта, множество Жулиа. Другие способы получения алгебраических фракталов. Метод побитовых операций. Реализация алгебраических фракталов.

    лекция [1,2 M], добавлен 29.12.2011

  • Сущность, основные свойства и классификация фракталов. Построение триадной кривой Коха и "дракона" Хартера-Хейтуэя, треугольник Серпинского и множество Жюлиа. Сущность L-кодирования. Создание программы на языке BorlandPascal для построения фракталов.

    курсовая работа [1,2 M], добавлен 13.04.2015

  • Понятие фрактала, способы его использования в компьютерной науке, в механике жидкостей, в телекоммуникациях, медицине, физике поверхностей, биологии. Множество Мандельброта и фрактальное дерево. Разработка кода программы в среде программирования Delрhi.

    курсовая работа [1,0 M], добавлен 09.06.2013

  • Приемы работы с инструментальной средой программирования С++. Кодирование арифметических и логических выражений с использованием стандартных библиотечных функций ввода, вывода в С++. Описание переменной вещественного типа в языке программирования С++.

    лабораторная работа [137,9 K], добавлен 13.06.2014

  • Краткая история становления языка программирования Pascal и основные понятия графики. Основные функции и процедуры работы с графикой в PascalABC. Создание графического проекта: понятие "фрактал" и реализация треугольника. Построения фрактала "Дерево".

    курсовая работа [1,4 M], добавлен 26.10.2014

  • Понятие фрактала и фрактальной геометрии. Роль фракталов в машинной графике, самоподобие как основное свойство. Области применения фракталов. Учение о сложных нелинейных динамических системах (теория хаоса). Интеграция детерминированных фракталов и хаос.

    курсовая работа [1,0 M], добавлен 20.08.2009

  • Основные принципы концепции типа данных в языках программирования. Разновидности структур данных. Дискретные и непрерывные скалярные типы. Файл, последовательность, множество. Линейный список. Сложность алгоритмов. Построение рекурсивных подпрограмм.

    презентация [2,5 M], добавлен 14.10.2013

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

    лабораторная работа [27,8 K], добавлен 28.05.2012

  • Разработка компьютерных игр как зрелищная и наиболее сложная отрасль программирования. Рассмотрение основных особенностей конструирования классов CGame и Players, а также алгоритмов вычисления траектории полета снаряда. Анализ алгоритма PassivePlayer.

    курсовая работа [5,1 M], добавлен 22.02.2013

  • Основы создания фрактальных композиций при помощи среды программирования Паскаль. Сущность и основа фрактальной графики. Графические возможности и операторы для рисования геометрических фигур в среде Паскаль. Примеры обозначения цветов на языке Паскаль.

    лабораторная работа [15,7 K], добавлен 12.06.2010

  • Использование нестандартных функций и подпрограмм (процедур) для составления алгоритмов вычислений. Программы для вычисления значение корней нелинейного уравнения по методу половинного деления. Составление алгоритма операций над матрицами и интегралами.

    курсовая работа [580,0 K], добавлен 23.08.2015

  • Рассмотрение областей применения компьютерной графики. Изучение основ получения различных изображений (рисунков, чертежей, мультипликации) на компьютере. Ознакомление с особенностями растровой и векторной графики. Обзор программ фрактальной графики.

    реферат [192,9 K], добавлен 15.04.2015

  • Сравнительная оценка существующих программ, повышающих разрешение изображений на языке Borland Delphi. Выбор оптимального инструментария для разработки логической схемы. Форма поиска файлов, преобразования изображений и реализации алгоритмов интерполяции.

    дипломная работа [3,0 M], добавлен 29.11.2011

  • Назначение компьютерной графики. Особенности трехмерной анимации. Технология создания реалистичных трехмерных изображений. Компьютерная графика для рисования на SGI: StudioPaint 3D. Пакет PowerAnimator как одна из программ трехмерной анимации на SGI.

    реферат [25,7 K], добавлен 31.03.2014

  • Различные способы обработки информации и программирование в среде Pascal. История создания языка. Блок схема с использованием заголовка функций задания. Описание подпрограмм. Сущность структурного программирования в аспекте написания алгоритмов программ.

    курсовая работа [331,9 K], добавлен 18.01.2016

  • Создание схем алгоритмов и составление программы на языке Pascal для вычисления значений заданных функций. Сущность и порядок нахождения значения определенного интеграла. Анализ работы подпрограмм. Разработка тестов для проверки правильности алгоритмов.

    контрольная работа [831,0 K], добавлен 24.11.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.