Скачиваний:
12
Добавлен:
01.05.2014
Размер:
76.8 Кб
Скачать

Санкт-Петербургский Государственный

Электротехнический Университет

Кафедра МОЭВМ

Отчёт по лабораторной работе №4

"Фракталы"

Выполнил: Васькина К.П.

Группа: 1352

Преподаватель: Герасимова Т.В.

Санкт-Петербург

2005г.

Задание

Разработать программу, рисующую фрактал следующего вида:

На первом шаге линия заменяется на 9 отрезков длиной в 1/3 изначальной линии.

Далее каждый из отрезков заменяется, в свою очередь, на 9 отрезков длиной в 1/3 заменяемого.

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

Разработанная программа позволяет рисовать фрактал глубиной от 0 до 6.

Рис.1. Представление фрактала с глубиной 3.

Рис.2. Представление фрактала с глубиной 6.

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

В функцию подаются координаты концов отрезка, для которого будут производится вычисления. Дальше по правилу FFRRRFRRL рисуется очередной фрагмент. После отрисовки каждого нового отрезка снова вызывается DrawFractal() для только что нарисованной линии. Ещё одним параметром функции является глубина, изначально это задаваемая пользователем величина (она равна глубине фрактала), с каждым рекурсивным вызовом эта величина уменьшается на 1. Когда этот параметр равняется 0, вычисления не производятся и начинается свёртывание рекурсии.

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

int COglshapeView::DrawFractal(UINT level, double lPtx, double lPty, double rPtx, double rPty)

{

//FFRRRFRRL

double newX1=0;

double newX2=0;

double newY1=0;

double newY2=0;

double shift=0;

if (level>0)

{

level-=1;

double shiftX=rPtx-lPtx;

double shiftY=rPty-lPty;

if (shiftX<0)

shiftX=-shiftX;

if (shiftY<0)

shiftY=-shiftY;

if (shiftX==0)

{

shift=shiftY/3; //длина следующей рисуемой линии

newY1=lPty+shift; //первый шаг F

glBegin(GL_LINES);

glVertex2d(lPtx,lPty);

glVertex2d(lPtx,newY1);

glEnd();

DrawFractal(level,lPtx,lPty,lPtx,newY1);

newY2=newY1+shift; //второй шаг F

glBegin(GL_LINES);

glVertex2d(lPtx,newY1);

glVertex2d(lPtx,newY2);

glEnd();

DrawFractal(level,lPtx,newY1,lPtx,newY2);

newX1=lPtx+shift; //третий шаг R

glBegin(GL_LINES);

glVertex2d(lPtx,newY2);

glVertex2d(newX1,newY2);

glEnd();

DrawFractal(level,lPtx,newY2,newX1,newY2);

newY1=newY2-shift; //четвёртый шаг R

glBegin(GL_LINES);

glVertex2d(newX1,newY2);

glVertex2d(newX1,newY1);

glEnd();

DrawFractal(level,newX1,newY1,newX1,newY2);

newX2=newX1-shift; //пятый шаг R

glBegin(GL_LINES);

glVertex2d(newX1,newY1);

glVertex2d(newX2,newY1);

glEnd();

DrawFractal(level,newX2,newY1,newX1,newY1);

newX1=newX2-shift; //шестой шаг F

glBegin(GL_LINES);

glVertex2d(newX2,newY1);

glVertex2d(newX1,newY1);

glEnd();

DrawFractal(level,newX1,newY1,newX2,newY1);

newY2=newY1+shift; //седьмой шаг R

glBegin(GL_LINES);

glVertex2d(newX1,newY1);

glVertex2d(newX1,newY2);

glEnd();

DrawFractal(level,newX1,newY1,newX1,newY2);

newX2=newX1+shift; //восьмой шаг R

glBegin(GL_LINES);

glVertex2d(newX1,newY2);

glVertex2d(newX2,newY2);

glEnd();

DrawFractal(level,newX1,newY2,newX2,newY2);

newY1=newY2+shift; //девятый шаг L

glBegin(GL_LINES);

glVertex2d(newX2,newY2);

glVertex2d(newX2,newY1);

glEnd();

DrawFractal(level,newX2,newY2,newX2,newY1);

}

else

if (shiftY==0)

{

shift=shiftX/3; //длина следующей рисуемой линии

newX1=lPtx+shift; //первый шаг F

glBegin(GL_LINES);

glVertex2d(lPtx,lPty);

glVertex2d(newX1,lPty);

glEnd();

DrawFractal(level,lPtx,lPty,newX1,lPty);

newX2=newX1+shift; //второй шаг F

glBegin(GL_LINES);

glVertex2d(newX1,lPty);

glVertex2d(newX2,lPty);

glEnd();

DrawFractal(level,newX1,lPty,newX2,lPty);

newY1=lPty-shift; //третий шаг R

glBegin(GL_LINES);

glVertex2d(newX2,lPty);

glVertex2d(newX2,newY1);

glEnd();

DrawFractal(level,newX2,newY1,newX2,lPty);

newX1=newX2-shift; //четвёртый шаг R

glBegin(GL_LINES);

glVertex2d(newX2,newY1);

glVertex2d(newX1,newY1);

glEnd();

DrawFractal(level,newX1,newY1,newX2,newY1);

newY2=newY1+shift; //пятый шаг R

glBegin(GL_LINES);

glVertex2d(newX1,newY1);

glVertex2d(newX1,newY2);

glEnd();

DrawFractal(level,newX1,newY1,newX1,newY2);

newY1=newY2+shift; //шестой шаг F

glBegin(GL_LINES);

glVertex2d(newX1,newY2);

glVertex2d(newX1,newY1);

glEnd();

DrawFractal(level,newX1,newY2,newX1,newY1);

newX2=newX1+shift; //седьмой шаг R

glBegin(GL_LINES);

glVertex2d(newX1,newY1);

glVertex2d(newX2,newY1);

glEnd();

DrawFractal(level,newX1,newY1,newX2,newY1);

newY2=newY1-shift; //восьмой шаг R

glBegin(GL_LINES);

glVertex2d(newX2,newY1);

glVertex2d(newX2,newY2);

glEnd();

DrawFractal(level,newX2,newY2,newX2,newY1);

newX1=newX2+shift; //девятый шаг L

glBegin(GL_LINES);

glVertex2d(newX2,newY2);

glVertex2d(newX1,newY2);

glEnd();

DrawFractal(level,newX2,newY2,newX1,newY2);

};

}

else

{

if (m_depth==0)

{

glBegin(GL_LINES);

glVertex2d(lPtx,lPty);

glVertex2d(rPtx,rPty);

glEnd();

};

};

return 0;

}

4

Соседние файлы в папке Лабораторная работа №45