Фрактали для дрімучих чайников

Фрактали в С ++ для дрімучих чайников.
«Український слід» в теорії фракталів

Термін «фрактал» ввів в ужиток французький математик польського походження Бенуа Мандельброт в 1975 році. У своїй книзі «Фрактальна геометрія природи» він пише: «фрактали називається структура, що складається з частин, які в якомусь сенсі подібні цілому».

Фрактали для дрімучих чайников

Фракталом може бути предмет зі структурою «самоподібності». Типовий приклад - російська дерев'яна іграшка Матрьошка, всередині якої знаходяться подібні фігурки меншого розміру. Російська «фрактальная» розписна Матрьошка з'явилася вУкаіни в кінці XIX століття. Мало хто знає, що Лівша не тільки підкував блоху, але і спорудив матрьошку розміром з блоху. А Чубайс в даний час працює над створенням нано матрьошки. Так що скоро можна буде говорити про «російською сліді» в теорії фракталів!

У 1872 році німецький математик Карл Вейерштрасс сконструював безперервну функцію у вигляді нескінченного тригонометричного ряду, яка ніде не диференційована. Розв'язана їм проблема досі турбує підступними питаннями студентів на іспиті з математики: «Якщо функція безперервна - вона диференційована?».

Про всяк випадок внесу ясність. Якщо безперервна крива має точку зламу, то в цій точці у неї відсутня дотична. А функція, графіком якої є ця крива, що не диференційована в точці зламу! Так ось графік функції Вейерштрасса «зламаний до невпізнання» - у всіх точках!

У 1904 р шведський математик Хельге фон Кох в статті «Про одну неперервну криву, яка не має дотичних» описав ще одну безперервну криву, ламану у всіх точках, яка через простоту конструкції виявилася чудовим прикладом фрактала. Саме з кривою Коха ми почнемо вивчення фракталів.

Фрактали в С ++ для Ch--

Крива Коха у всіх подробицях своєї краси

Щоб отримати Криву Коха, відрізок прямої ділимо на три рівні частини і на центральному відрізку будуємо рівносторонній трикутник, після чого підстава трикутника видаляємо. Отримана ламана лінія з чотирьох відрізків являє трафарет (шаблон, генератор), за яким будується Крива Коха.

Застосовуючи трафарет до кожного з чотирьох відрізків самого трафарету, отримуємо перше наближення, що складається з 16 відрізків. Далі застосовуємо трафарет до кожного відрізку отриманої кривої, знаходимо друге наближення, що складається з 64 відрізків. В межі виходить Крива Коха.

Для побудови Кривий Коха та інших фракталів в даній статті буде використана стандартна програма, яка містить

Функція створення трафарету Traf

Нам знадобиться функція, яка за координатами кінців відрізка AB вирахує координати всіх вузлових точок трафарету. Щоб створити таку функцію будуть потрібні знання на рівні 9-го класу середньої школи. Формули для координат всіх вузлових точок трафарету Кривий Коха наведені на малюнку справа.

Фрактали для дрімучих чайников

Зліва розташована функція Traf. яка має п'ять аргументів: координати кінців відрізка (xA. yA), (xB. yB) і параметр k. Координати вузлових точок запам'ятовуються в осередках масивів: knx [] і kny [] (від слова «knot» - «вузол»).

При побудові трафарету (нульове наближення) вважаємо k = 0, тоді координати вузлів потрапляють в початкові осередки масивів. В інших наближеннях щоб уникнути накладення координат використовується нульове значення аргументу k.

Функція побудови фрактала Fract

Ця функція конструює фрактал. За замовчуванням центр декартової прямокутної системи координат розташований в центрі вікна, а позитивні осі відсікають на кордонах поодинокі відрізки. При бажанні оператором gluOrtho () можна змінити систему координат. Як це зробити докладно описано в статті «OpenGL в С ++ для Ср--».

Щоб глибше зрозуміти структуру цієї функції, запишемо її окремо для нульового та першого наближень. Для обчислення тільки нульове наближення (програма внизу зліва) управління передається функції Traf. і центральна горизонтальна лінія віконця A (-1, 0), B (1, 0) перетворюється в трафарет. Оскільки k = 0, координати вузлів виявляються в перших п'яти осередках масивів knx [] і kny [].

Фрактали для дрімучих чайников

Для обчислення тільки перше наближення (програма вгорі праворуч) додаємо два оператора циклу for. Перший запам'ятовує отримані на попередньому етапі координати вузлів трафарету в масивах kn1x [] і kn1y [] (оголошені всередині функції, так як ніде більше не використовуються). Другий оператор дробить трафаретом на вузли відрізки самого трафарету. Аргумент k кожен раз множиться на 4, тому в масивах knx [] і kny [] виявляються кінці всіх r = 16 відрізків першого наближення.

Всі наступні наближення вимагають кожен раз додавати два однакових оператора, тому доцільно створити єдиний процес за допомогою зовнішнього оператора циклу. Ось як виглядає функція в загальному випадку:

Фрактали для дрімучих чайников

Кількість відрізків r в кожному наближенні дорівнює числу 4 у відповідній мірі.

Функція малювання Draw і головна функція програми main

Ці функції докладно описані в статті OpenGL в С ++ для Сh--.

Команди поза зеленої зони функції Draw пускають у хід процес малювання. Усередині зеленої зони перші два оператора фіксують колір і товщину ліній. Операторні дужки glBegin () / glEnd () містять координати точок, які за допомогою аргументу GL_LINES з'єднуються попарно прямими лініями.

Фрактали для дрімучих чайников

Всі команди, розташовані поза зеленої зони функції main. вбудовують бібліотеку OpenGL в С ++ і приводять її в дію. Оператори всередині зеленої зони фіксують послідовно: місце розташування вікна на екрані, його розміри, дають назву віконця, відкривають його і задають колір. Потім вступають в дію функції Fract і Draw.

Ось як вона виглядає:

Оголошуємо параметр зміщення осередків к. Число відрізків у наближенні r і число наближень n.

Збираємо всю програму в єдине ціле

Фрактали для дрімучих чайников

Фрактали для дрімучих чайников

Фрактали для дрімучих чайников

Фрактали для дрімучих чайников

Фрактали для дрімучих чайников

Фрактали для дрімучих чайников

Можна отримати і 5-е наближення, але воно не внесе видимих ​​змін в малюнок.

Фрактали в С ++ для Ch--

Сніжинка і Антіснежінка Коха.
«Ялинка Дрімучого чайника»

Застосуємо трафарет Кривий Коха до сторін правильного трикутника. В результаті отримаємо перше наближення. Ділимо трафаретом відрізки чергового наближення і в межі виходить Сніжинка Коха.

Для Сніжинки Коха можна використовувати програму fractal. внісши невеликі зміни в функцію побудови фрактала.

Функція побудови фрактала Fract

Ця функція відрізняється від такої для Кривий Коха верхньою частиною (перші шість рядків).

Задаємо координати кінців нижньої основи трикутника A (-0.75, -0.5), B (0.75, -0.5) і знаходимо третю вершину C з умови, що трикутник правильний.

Застосовуємо трафарет по черзі до всіх сторін трикутника: три рази звертаємося до функції Traf. даючи значення параметру k = 0, 4, 8. Отримуємо нульове наближення з 12 відрізків з координатами вузлів в потрібних комірках масивів. Далі побудова фрактала відбувається за вже відомим сценарієм.

Фрактали для дрімучих чайников

Сніжинка і Антіснежінка Коха

Фрактали для дрімучих чайников

Якщо трафарет сконструювати таким чином, щоб трикутники були спрямовані всередину, то отримаємо Антіснежінку Коха. Для цього в функції Traf програми fractal змінимо в середині третього і четвертого операторів знаки (вони виділені червоним кольором) з плюса на мінус. Ось як виглядає Антіснежінка Коха в другому і п'ятому наближеннях:

Фрактали для дрімучих чайников

Справа була на Великдень. Поки я в операторах змінював знаки з плюса на мінус, щоб отримати Антіснежінку Коха, по телевізору почалася трансляція Зіслання Благодатного вогню в Єрусалимі. Це видовище так на мене подіяло, що я встиг змінити тільки один знак. На екрані з'явився «посланий згори» дивовижний фрактал! Назву його в нашу честь - «Ялинка Дрімучого чайника»! Насолоджуйтесь!

Фрактали в С ++ для Ch--

«Функція-матрьошка». створюємо дерева

При побудові фракталів часто використовують «функції-матрьошки», які звертаються «самі до себе». У цьому випадку немає необхідності створювати трафарет, так як він вже закладений всередині таких функцій.

Ось простенька схема «функції-матрьошки»:

Фрактали для дрімучих чайников

Це функція від одного аргументу: Matr (n). Усередині фігурних дужок оператора циклу вона звертається сама до себе. зменшуючи аргумент на 1. Без умовного оператора програма «зациклиться».

Ця функція буде n раз «не санкціонована» виходити з циклу, кожен раз зменшуючи n на одиницю. Після досягнення параметром n нульового значення умовний оператор скасує звернення функції до самої себе, і програма «законно» вийде з циклу. Потім вона n раз «не санкціонована» увійде в цикл, кожен раз збільшуючи n на 1. причому якщо при вході виявиться, що i = 0. то з цього місця цикл продовжить роботу. Так буде відбуватися, поки n не досягне початкового значення. «Функція-матрьошка» генерує «розгалужених» процес, який використовують при побудові фракталів.

Фрактали для дрімучих чайников

Щоб створити фрактальное дерево розглянемо гілка AB довжиною L з кутом нахилу а до горизонтальної осі. Якщо відомі координати початкової точки А. то координати кінцевої точки В може обчислити учень 7Б класу середньої школи. Наведені формули для xB і yB будуть використані при конструюванні фрактала в функції Fract.

Криві Леві і Дерева Піфагора тісно пов'язані з фракталами, які називають Драконами через їх схожості з зображеннями китайських драконів.

Способи створення Кривих Леві і Дерев Піфагора схожі. Розрізняються вони тільки трафаретами, які прилаштовуються із зовнішнього боку до двох катетам прямокутного трикутника.

Якщо ці трафарети черзі направляти в різні боки від катетів, то вийдуть Дракони.

Дракони Острови Леві

Починаємо будувати Криву Леві. але трафарет пристроюємо до катетам прямокутних трикутників, направляючи його по черзі в різні боки. Для цього в програмі levy в другому операторі функції Fract при зверненні до самої себе міняємо місцями точки B і С (в програмі вони відзначені червоним кольором). Оператор повинен виглядати так: Fract (x B. y B. x C. y C. n-1). На екрані з'являється Дракон.

Фрактали для дрімучих чайников

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

Те ж саме можна зробити з Островами Леві і отримати «острівних» Драконів:

Фрактали для дрімучих чайников

Будуємо Дерево Піфагора. але направляємо трафарет в різні боки від катетів віяла трикутників, і на екрані з'являється Дракон Піфагора. Для цього в програмі pifagor в функції побудови фрактала Fract в першому операторі звернення до функції Traf під знаком циклу міняємо місцями аргументи масивів (відмічені червоним кольором). Оператор повинен виглядати так: Traf (knx [i + 1], kny [i + 1], knx [i], kny [i], 5 * r).

Фрактали для дрімучих чайников

Зліва на малюнку Дракон Піфагора в 4-му наближенні з кольоровим «віялом» трикутників. Правда, він більше нагадує летить на бойове завдання дальній бомбардувальник Ту-22М3. А на правому малюнку - розфарбований Дракон Піфагора в 10-м наближенні.

Фрактали в С ++ для Ch--

Дайте мені жінку білу, білу.
Я її в синю перероблю

Залишилося виконати обіцянку і допомогти поетові переробити білу, білу жінку в синю. Ця жінка на малюнку Анрі Матісса називається «Оголена з апельсинами». Після освоєння OpenGL і С ++ ми можемо без праці намалювати Сніжинку і Антіснежінку Коха. «Ялинку дрімучого чайника», Криву Леві. «Обдути вітром» Дерево Піфагора і перетворити його в Дракона.

Фрактали для дрімучих чайников

Однак при спробі переробити білу, білу жінку в синю відбувається збій і виходить «Дракон, запечений з апельсинами». Питається, чому? А чому б і ні? Це також не погано! Залишилося тільки збігати за пляшкою «Путинки»!

Все сталося абсолютно випадково, як і планувалося.

Схожі статті