Фракталы
Національний технічний університет України
«Київський Політехнічний Інститут»
кафедра
автоматики та управління в технічних
системах
«Фрактали»
Курсова робота
З дисципліни
«Об’єктно – орієнтоване
| Керівник
Хмелюк В.С. |
Виконавець
Хотаб О.В. | |
| «Допущений до захисту» _________________________ (Особистий підпис керівника) |
|
__________________________ (Особистий підпис виконавця) |
| « »_____________2010р. |
« » _____________2010р. | |
| Захищений з оцінкою |
||
| ____________________ (оцінка) |
||
| Члени комісії: | ||
| _____________________ (Особистий підпис) |
_______________________ (Розшифровка підпису) | |
| _____________________ (Особистий підпис) |
_______________________ (Розшифровка підпису) |
Київ - 2010
_____НАЦІОНАЛЬНИЙ ТЕХНИЧНИЙ УНИВЕРСИТЕТ УКРАЇНИ «КПІ»___
(назва
вищого навчального закладу)
Кафедра АВТОМАТИКИ ТА УПРАВЛІННЯ В ТЕХНІЧНИХ СИСТЕМАХ
Дисципліна
«Об’єктно-орієнтовне
програмування»
Курс
__-й Група _______ _
Семестр 2-й
ЗАВДАННЯ
на курсову роботу студента
______________________Хотаба
Олександра Вячеславовича_________________
1. Тема
роботи
Побудова фракталів.
Довідник з теорії
геометричних та алгебричних_
фракталів та їх відображення
на екрані. ______________________________
2.Строк
здачі студентом закінченої роботи________________________
3. Вихідні дані по роботі:
ОС: Windows XP.
Мова розробленої програми:
С++, середовище розробки:_____ Borland C++(v.3.1.).
______________________________
4. Зміст розрахунково –пояснювальної записки (перелік питання, які підлягають розробці)
1.
Вступ. 2.Зміст 3.Постановка
задачі. 4.Теоретична
інформація. 5.Висновок.
6.Література. 7.Код програми.
8.Приклади виконання
задачі. ___________________ ______________________________
5. Перелік графічного матеріалу ( з точним зазначенням обов’язкових креслень)
______________________________
6. Дата видачі
завдання ______________________________
| №
п/п |
Назва етапів виконання курсової роботи | Термін виконання етапів роботи | Підпис або примітки |
| 1 | Отримання теми курсової роботи | 25.01.10 | |
| 2 | Узгодження поставленої задачі з керівником | 30.01 | |
| 3 | Пошук та вивчення літератури з питань курсової роботи | 31.01-20.02 | |
| 4 | Освоєння теорії по даній тематиці | 20.02-13.03 | |
| 5 | Розробка сценарію роботи програми | 13.03-18.03 | |
| 6 | Розробка алгоритму рішенню задачі | 20-29.03 | |
| 7 | Узгодження створеного плану та структури програми з керівником | 14.03 | |
| 8 | Розробка та налагодження інтерфейсу програми | 16.03-22.03 | |
| 9 | Розробка програмного забезпечення | 01.04-16.04 | |
| 10 | Налаштування програми | 16.04-20.04 | |
| 11 | Тестування програми | 25.04 | |
| 12 | Підготовка пояснювальної записки | 30.04 | |
| 13 | Здача пояснювальної записки курсової роботи на перевірку керівнику | 13.05 | |
| 14 | Захист курсової роботи | 20.05 | |
| 15 | |||
| 16 | |||
| 17 | |||
| 18 | |||
| 19 |
Календарний
план
| Студент_________________ (підпис) |
(прізвище, ім’я, по батькові) | |
| Керівник________________ (підпис) |
(прізвище, ім’я, по батькові) | |
| «____»_________20___ р. |
1. Вступ
Поняття фрактал та фрактальна геометрія, що з'явилися в кінці 70-х, з середини 80-х міцно увійшли в обіг математиків і програмістів. Слово фрактал утворена від латинського fractus і в перекладі означає що складається із фрагментів. Воно було запропоновано Бенуа Мандельбротом в 1975 році для позначення нерегулярних, але самоподібних структур, якими він займався. Народження фрактальної геометрії прийнято пов'язувати з виходом в 1977 році книги Мандельброта `The Fractal Geometry of Nature '. У його роботах використані наукові результати інших вчених, які працювали в період 1875-1925 років в тій же області (Пуанкаре, Фату, Жюліа, Кантор, Гаусдорф). Але лише в наш час вдалося об'єднати їх роботи в єдину систему.
2. Зміст
- Вступ.
- Зміст.
- Постановка задачі.
- Теоретична інформація.
- Висновок.
- Література.
- Код програми.
- Приклади виконання задачі.
3. Постановка завдання
В даній лабораторній роботі «Фрактали», потрібно самостійно ознайомитися з теорією даного розділу математики, та за допомогою отриманих знань проілюструвати свої знання в створенні коду програми, на базовій мові: С++. Основним завданням є про ілюстрування роботи алгебричних та геометричних фракталів в графічному вигляді. А також застосування різноманітних алгоритмів розробки фракталів для більш об’ємного та доцільного пізнання даного розділу математики.
4. Теоретична інформація
Поняття
"фрактал".
Поняття фрактал та фрактальна геометрія,
що з'явилися в кінці 70-х, з середини 80-х
міцно увійшли в обіг математиків і програмістів.
Слово фрактал утворено від латинського
fractus і в перекладі означає той що складається
із фрагментів. Воно було запропоновано
Бенуа Мандельбротом в 1975 році для позначення
нерегулярних, але самоподібних структур,
якими він займався. Народження фрактальної
геометрії прийнято пов'язувати з виходом
в 1977 році книги Мандельброта `The Fractal Geometry
of Nature '. У його роботах використані наукові
результати інших вчених, які працювали
в період 1875-1925 років в тій же області (Пуанкаре,
Фату, Жюліа, Кантор, Гаусдорф). Але лише
в наш час вдалося об'єднати їх роботи
в єдину систему.
Роль фракталів в машинній графіці сьогодні
досить велика. Вони приходять на допомогу,
наприклад, коли потрібно, за допомогою
декількох коефіцієнтів, задати лінії
і поверхні дуже складної форми. З точки
зору машинної графіки, фрактальна геометрія
незамінна при генерації штучних хмар,
гір, поверхні моря. Фактично знайдений
спосіб легкого представлення складних
неевклідових об'єктів, образи яких досить
схожі на природні.
Одним з основних властивостей фракталів
є самоподібність. У самому простому випадку
невелика частина фрактала містить інформацію
про весь фрактал.
Визначення фрактала, дане Мандельбротом,
звучить так: "Фракталом називається
структура, що складається з частин, які
в якомусь сенсі подібні цілому".
Фрактальні
розмірності.
У своєму повсякденному
житті ми постійно зустрічаємося з розмірністю.
Ми прикидаємо довжину дороги (250 м), дізнаємося
площа квартири (78 м2) і шукаємо на наклейці
об'єм пляшки солодкої води (0.33 дм3). Це
поняття цілком інтуїтивно ясно і, здавалося
б, не потребує роз'яснення. Лінія має розмірність
1. Це означає, що, вибравши точку відліку,
ми можемо будь-яку точку на цій лінії
визначити за допомогою 1 числа - позитивного
або негативного. Причому це стосується
всіх ліній - оточення, квадрат, парабола
і т.д.
Розмірність
2 означає, що будь-яку точку ми можемо
однозначно визначити двома числами. Не
треба думати, що двовимірний - значить
плоский. Поверхня сфери теж двовимірні
(її можна визначити за допомогою двох
значень - кутів на кшталт ширини і довготи).
Якщо дивитися
з математичної точки зору, то розмірність
визначається таким чином: для одновимірних
об'єктів - збільшення в два рази їх лінійного
розміру призводить до збільшення розмірів
(у даному випадку довжини) у два рази (2
^ 1).
Для двовимірних
об'єктів збільшення в два рази лінійних
розмірів призводить до збільшення розміру
(наприклад, площа прямокутника) в чотири
рази (2 ^ 2).
Для 3-х мірних
об'єктів збільшення лінійних розмірів
у два рази приводь до збільшення обсягу
в вісім разів (2 ^ 3) і так далі.
Таким чином,
розмірність D можна розрахувати виходячи
із залежності збільшення "розміру"
об'єкта S від збільшення лінійних розмірів
L. D = log (S) / log (L). Для лінії D = log (2) / log (2) =
1. Для площині D = log (4) / log (2) = 2. Для об'єму
D = log (8) / log (2) = 3. Навіщо все це? А для того
щоб зрозуміти, як відокремлювати фрактали
від фізичного предмету. Спробуємо порахувати
розмірність для кривої Пеано. Отже, у
нас вихідна лінія, що складається з трьох
відрізків довжини Х, замінюється на 9
відрізків втричі меншою довжини. Таким
чином, при збільшенні мінімального відрізка
в 3 рази довжина всієї лінії збільшується
в 9 разів і D = log (9) / log (3) = 2 - двовимірний
об'єкт!
Фрактал це ...
Так ось, коли
розмірність фігури одержуваної з якихось
найпростіших об'єктів (відрізків) більше
розмірності цих об'єктів - ми маємо справу
з фрактали.
Геометричні фрактали.
Саме
з них і починалася історія фракталів.
Цей тип фракталів виходить шляхом простих
геометричних побудов. Зазвичай при побудові
цих фракталів роблять так: береться "запал"
- аксіома - набір відрізків, на підставі
яких буде будуватися фрактал. Далі до
цієї "запал" застосовують набір
правил, який перетворює її в будь-яку
геометричну фігуру. Далі до кожної частини
цієї фігури застосовують знову той же
набір правил. З кожним кроком фігура буде
ставати все складніше і складніше, і якщо
ми проведемо (принаймні, в умі) нескінченну
кількість перетворень - отримаємо геометричний
фрактал.
Розглянута вище крива Пеано є геометричним
фрактали. На малюнку нижче наведені інші
приклади геометричних фракталів (зліва
направо Сніжинка Коха,, Трикутник Серпінського).
З
цих геометричних фракталів дуже цікавим
і досить знаменитим є перший - сніжинка
Коха. Будується вона на основі рівностороннього
трикутника. Кожна лінія якого ___ замінюється
на 4 лінії кожна довжиною в 1 / 3 початкової
_ / \ _. Таким чином, з кожною итерацією довжина
кривої збільшується на третину. І якщо
ми зробимо нескінченне число ітерацій
- отримаємо фрактал - сніжинку Коха нескінченної
довжини. Виходить, що наша нескінченна
крива покриває обмежену площу. Спробуйте
зробити те ж саме методами і фігурами
з евклідової геометрії.
Розмірність сніжинки Коха (при збільшенні
сніжинки в 3 рази її довжина зростає в
4 рази) D = log (4) / log (3) = 1.2619 ...
Друга властивість фракталів - самоподібність.
Візьмемо, наприклад, трикутник Серпінського.
Для його побудови з центру рівностороннього
трикутника "виріжемо" трикутник.
Повторимо цю ж процедуру для трьох утворених
трикутників (за винятком центрального)
і так до нескінченності. Якщо ми тепер
візьмемо будь-який з утворених трикутників
і збільшимо його - отримаємо точну копію
цілого. У даному випадку ми маємо справу
з повною самоподібністю.
Алгебраїчні
фрактали.
Друга велика група фракталів - алгебраїчні.
Свою назву вони отримали за те, що їх будують,
на основі алгебраїчних формул іноді вельми
простих. Методів отримання алгебраїчних
фракталов декілька. Один з методів являє
собою багаторазовий (ітераційний) розрахунок
функції Zn +1 = f (Zn), де Z - комплексне число,
а f якась функція. Розрахунок даної функції
продовжується до виконання певної умови.
І коли ця умова виконається - на екран
виводиться крапка. При цьому значення
функції для різних точок комплексної
площині може мати різні поведінки:
1. З плином часу прямує до нескінченності.
2. Прагне до 0
3. Приймає декілька фіксованих значень
і не виходить за їхні межі.
4. Поведінка хаотично, без будь-яких тенденцій.
Щоб проілюструвати алгебраїчні фрактали звернемося до класики - множени Мандельброта.
Для його побудови
нам необхідні комплексні числа. Комплексні
числа можна складати, віднімати, множити,
ділити, підносити до степеня і витягувати
корінь, не можна лише їх порівнювати.
Комплексне число можна зобразити як точку
на площині, у якої координата Х це дійсна
частина a, а Y це коефіцієнт при уявній
частині b.
Функціонально множина Мандельброта визначається
як Zn +1 = Zn * Zn + C. На малюнку, що зображує
множину Мандельброта я взяв невелику
ділянку і збільшив її до розмірів всього
екрану (як у мікроскоп). Що ж ми бачимо?
Прояв самоподібності. Не точна самоподібність,
але близька і з нею ми будемо стикатися
постійно, збільшуючи частини нашого фрактала
більше і більше. До яких же пір ми можемо
збільшувати наше безліч? Так от якщо ми
збільшимо його до межі обчислювальної
потужності комп'ютерів, то покриємо площу
рівну площі сонячної системи аж до Сатурна.
Стохастичні
фрактали.
Ще одним відомим класом фракталів є стохастичні
фрактали, що утворюються в тому випадку,
якщо в ітераційному процесі випадковим
чином змінювати будь-які його параметри.
При цьому виходять об'єкти дуже схожі
на природні - несиметричні дерева, порізані
берегові лінії і т.д. Двовимірні стохастичні
фрактали використовуються при моделюванні
рельєфу місцевості і поверхні моря.
5. Висновок
Метою даної роботи було розроблення програми, яка дозволить реалізувати та більш наглядно пояснити, за допомогою графіки, що таке фрактал. В даній роботі реалізовані як геометричні фрактали так и алгебраїчні. Беручи до уваги результати – мета була досягнута.
6. Література
1. http://www.michurin.com.ru/
2. http://fractalworld.xaoc.ru
4. http://algolist.manual.ru/
5. Балханов В.К. «Введение в теорию фрактального исчисления»
6. Мандельброт Б. Фрактальная геометрия природы. — М.: «Институт компьютерных исследований», 2002.
7. Федер Е. Фракталы. — М: «Мир», 1991.
8. Шредер М. Фракталы, хаос, степенные законы. Миниатюры из бесконечного рая. — Ижевск: «РХД», 2001.
9. Кроновер Р. М. Фракталы и хаос в динамических системах. Основы теории.
10. Пайтген Х.-О., Рихтер П. Х. Красота фракталов. — М.: «Мир», 1993.
7. Код програми
#include<dos.h>
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<graphics.h>
class Start{
int key;
int color;
int pos;
void print(int x, int y, char *str);
void block(int x, int y, int color, char *str);
public:
Start();
~Start();
virtual void Draw(int x, int y, int l, float u)=0;
void GD();
void menu();
};
class TTree: public Start{
public:
int Draw(int x, int y, int l);
};
class HTree: public Start{
public:
int Draw(int x, int y, int l);
};
class BTree: public Start{
public:
int Draw(int x, int y, int l);
};
class VTree: public Start{
public:
int Draw(int x, int y, float l);
int LineTo1(int x, int y, float l, float u);
};
class PITree: public VTree{
public:
int Draw(int x, int y, float l, float u);
int LineTo1(int x, int y, float l, float u);
};
class DTree: public VTree{
public:
int Draw(int x, int y, float l, float u);
LineTo1(float x, float y, float l, float u);
};
class JuliaFractal{
typedef struct {float Re; float Im;} Complex;
Complex Result;
Complex ComplexAdd(Complex X, Complex Y)
{
Result.Re = X.Re + Y.Re;
Result.Im = X.Im + Y.Im;
return Result;
}
Complex ComplexMult(Complex X, Complex Y)
{
Result.Re = X.Re*Y.Re - X.Im*Y.Im;
Result.Im = X.Re*Y.Re + X.Im*Y.Re;
return Result;
}
float ComplexAbs(Complex X);
public:
void JulFrac();
};
class SPYMBL{
#define ZOOM 1
#define WDT 640
#define HGT 480
typedef struct Complex {long double x; long double y;} Complex;
void Sqr(Complex *z);
char GetColor(Complex);
public:
void MBS(long double, long double, long double, long double);
};
class THORM{
int iter;
int max1;
struct TComplex{ double x; double y;};
TComplex z, t, c;
double p;
int x, y, n;
int mx, my;
int i;
public:
void THM();
};
class HENONIFS{
#define m 3
int i, n, l;
float x1, y1, x, y;
float a[m], b[m];
public:
void HNIFS();
};
void Start::print(int x, int y, char *str)
{
gotoxy(x,y);
cprintf(str);
}
void Start::block(int x, int y, int color, char *str)
{
textcolor(color);
print(x,y,str);
}
void Start::menu()
{
TTree *F0;
HTree *F1;
BTree *F2;
VTree *F3;
PITree *F4;
DTree *F5;
JuliaFractal *F6;
SPYMBL *F7;
THORM *F8;
HENONIFS *F9;
Start *reset;
color=4;
char *mas[11]=
{
"є1. frac1 є",
"є2. frac2 є",
"є3. frac3 є",
"є4. frac4 є",
"±5. frac5 є",
"±6. frac6 є",
"±7. frac7 є",
"є8. frac8 є",
"є9. frac9 є",
"є10. frac10 є",
"є11. exit є"
};
clrscr();
print(7,12,"ЗД-ДДДД-ДД·");
print(7,13,"є1. frac1 є");
print(7,14,"є2. frac2 є");
print(7,15,"є3. frac3 є");
print(7,16,"є4. frac4 є");
print(7,17,"±5. frac5 є");
print(7,18,"±6. frac6 є");
print(7,19,"±7. frac7 є");
print(7,20,"є8. frac8 є");
print(7,21,"є9. frac9 є");
print(7,22,"є10. frac10 є");
print(7,23,"є11. exit є");
print(7,24,"ЗД-ДДДД-ДДЅ");
block(7,13,color,mas[0]);
pos=0;
do
{
key=getch();
switch(key)
{
case 80:
{
if (pos<10)
{
pos++;
block(7, 13+pos-1, 7, mas[pos-1]);
block(7, 13+pos, color, mas[pos]);
}
else
{
block(7, 13+pos, 7, mas[pos]);
pos=10;
block(7, 13+pos, color, mas[pos]);
}
break;
};
case 72:
{
if (pos>0)
{
pos--;
block(7, 13+pos+1, 7, mas[pos+1]);
block(7, 13+pos, color, mas[pos]);
}
if (pos<0)
{
block(7, 13+pos, 7, mas[pos]);
pos=9;
block(7, 13+pos, color, mas[pos]);
}
break;
};
case 13:
{
switch(pos)
{
case 0:{GD(); F0->Draw(320,460,300); getch(); closegraph(); reset->menu();};
case 1:{GD(); F1->Draw(320,240,640); getch(); closegraph(); reset->menu();};
case 2:{GD(); F2->Draw(320,350,256); getch(); closegraph(); reset->menu();};
case 3:{GD(); F3->Draw(320,380,400); getch(); closegraph(); reset->menu();};
case 4:{GD(); F4->Draw(320,460,200.0,M_PI/2)
case 5:{GD();
case 6:{GD(); F6->JulFrac(); getch(); closegraph(); reset->menu();};
case 7:{GD(); F7->MBS(-2*ZOOM, 2/3.0*ZOOM, -1*ZOOM, 1*ZOOM); getch(); closegraph(); reset->menu();};
case 8:{GD(); F8->THM(); getch(); closegraph(); reset->menu();};