Фрактальная графика.

25.07.2013 15:45

Понятие фрактала и история появления фрактальной графики

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

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

 

 

Рис. 1. Алгоритм Пеано

 

На первом шаге он брал прямую линию и заменял ее на 9 отрезков длинной в 3 раза меньшей, чем длинна исходной линии (Часть 1 и 2 Рисунка 1). Далее он делал то же самое с каждым отрезком получившейся линии. И так до бесконечности. Ее уникальность в том, что она заполняет всю плоскость. Доказано, что для каждой точки на плоскости можно найти точку, принадлежащую линии Пеано. Кривая Пеано и пыль Кантора выходили за рамки обычных геометрических объектов. Они не имели четкой размерности. Пыль Кантора строилась вроде бы на основании одномерной прямой, но состояла из точек, а кривая Пеано строилась на основании одномерной линии, а в результате получалась плоскость. Во многих других областях науки появлялись задачи, решение которых приводило к странным результатам, на подобие описанных (Броуновское движение, цены на акции).

Вплоть до 20 века шло накопление данных о таких странных объектах, без какой либо попытки их систематизировать. Так было, пока за них не взялся Бенуа Мандельброт – отец современной фрактальной геометрии и слова фрактал. Работая в IBM математическим аналитиком, он изучал шумы в электронных схемах, которые невозможно было описать с помощью статистики. Постепенно сопоставив факты, он пришел к открытию нового направления в математике – фрактальной геометрии.

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

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

Чтобы представить себе фрактал понаглядней рассмотрим пример, приведенный в книге Б.Мандельброта «Фрактальная геометрия природы» ставший классическим – «Какова длина берега Британии?». Ответ на этот вопрос не так прост, как кажется. Все зависит от длины инструмента, которым мы будем пользоваться. Померив берег с помощью километровой линейки мы получим какую–то длину. Однако мы пропустим много небольших заливчиков и полуостровков, которые по размеру намного меньше нашей линейки. Уменьшив размер линейки до, скажем, 1 метра – мы учтем эти детали ландшафта, и, соответственно длина берега станет больше. Пойдем дальше и измерим длину берега с помощью миллиметровой линейки, мы тут учтем детали, которые больше миллиметра, длина будет еще больше. В итоге ответ на такой, казалось бы, простой вопрос может поставить в тупик кого угодно – длина берега Британии бесконечна.

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

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

  

Рис.2. Триадная кривая Хельги фон Кох

 

Берем отрезок и среднюю его треть переламываем под углом 60 градусов. Затем повторяем эту операцию с каждой из частей получившейся ломаной – и так до бесконечности. В результате мы получим простейший фрактал – триадную кривую, которую в 1904 году открыла математик Хельга фон Кох.

Если на каждом шаге не только уменьшать основной мотив, но также смещать и поворачивать его, можно получить более интересные и реалистически выглядящие образования, например, лист папоротника или даже целые их заросли. А можно построить весьма правдоподобный фрактальный рельеф местности и покрыть её очень симпатичным лесом. В 3D Studio Max, например, для генерации деревьев используется фрактальный алгоритм. И это не исключение – большинство текстур местности в современных компьютерных играх представляют фракталы. Горы, лес и облака на картинке – фракталы.

Файлы фрактальных изображений имеют расширение fif. Обычно файлы в формате fif получаются несколько меньше файлов в формате jpg, но бывает и наоборот. Самое интересное начинается, если рассматривать картинки со все большим увеличением. Файлы в формате jpg почти сразу демонстрируют свою дискретную природу – появляется пресловутая лесенка. А вот fif файлы, как и положено фракталам, с ростом увеличения показывают все новую степень детализации структуры, сохраняя эстетику изображения.

 

Понятие размерности и ее расчет

В своей повседневной жизни мы постоянно встречаемся с размерностями. Мы прикидываем длину дороги, узнаем площадь квартиры и т.д. Это понятие вполне интуитивно ясно и, казалось бы, не требует разъяснения. Линия имеет размерность 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 – двумерный объект.

Когда размерность фигуры получаемой из каких–то простейших объектов (отрезков) больше размерности этих объектов – мы имеем дело с фракталом.

 

Геометрические фракталы

Именно с них и начиналась история фракталов. Этот тип фракталов получается путем простых геометрических построений. Обычно при построении этих фракталов поступают так: берется «затравка» – аксиома – набор отрезков, на основании которых будет строиться фрактал. Далее к этой «затравке» применяют набор правил, который преобразует ее в какую–либо геометрическую фигуру. Далее к каждой части этой фигуры применяют опять тот же набор правил. С каждым шагом фигура будет становиться все сложнее и сложнее, и если мы проведем бесконечное количество преобразований – получим геометрический фрактал.

Рассмотренная ранее кривая Пеано является геометрическим фракталом. На рис. 3 приведены другие примеры геометрических фракталов (сверху вниз Снежинка Коха, Лист, Треугольник Серпинского). 

 

Рис.3. Снежинка Коха, Лист, треугольник Серпинского. 

 

Из этих геометрических фракталов очень интересным и довольно знаменитым является – снежинка Коха. Строится она на основе равностороннего треугольника. Каждая линия которого заменяется на 4 линии каждая длинной в 1/3 исходной. Таким образом, с каждой итерацией длинна кривой увеличивается на треть. И если мы сделаем бесконечное число итераций – получим фрактал – снежинку Коха бесконечной длинны. Получается, что наша бесконечная кривая покрывает ограниченную площадь.

Размерность снежинки Коха (при увеличении снежинки в 3 раза ее длина возрастает в 4 раза) D=log(4)/log(3)=1.2619...

Для построения геометрических фракталов хорошо приспособлены так называемые L–Systems. Суть этих систем состоит в том, что имеется определенных набор символов системы, каждый из которых обозначает определенное действие и набор правил преобразования символов.

 

Алгебраические фракталы

Вторая большая группа фракталов – алгебраические. Свое название они получили за то, что их строят, на основе алгебраических формул иногда весьма простых. Методов получения алгебраических фракталов несколько. Один из методов представляет собой многократный (итерационный) расчет функции Zn+1=f(Zn), где Z – комплексное число, а f некая функция. Расчет данной функции продолжается до выполнения определенного условия. И когда это условие выполнится – на экран выводится точка. При этом значения функции для разных точек комплексной плоскости может иметь разное поведение:

  • с течением времени стремится к бесконечности.
  • стремится к 0
  • принимает несколько фиксированных значений и не выходит за их пределы.
  • поведение хаотично, без каких либо тенденций.

Чтобы проиллюстрировать алгебраические фракталы обратимся к классике – множеству Мандельброта (рис. 4).

 

Рис.4. Множество  Мандельброта.

 

Для его построения нам необходимы комплексные числа. Комплексное число – это число, состоящее из двух частей – действительной и мнимой, и обозначается оно a+bi. Действительная часть a это обычное число в нашем представлении, а bi – мнимая часть. i – называют мнимой единицей, потому, что если мы возведем i в квадрат, то получим –1.

Комплексные числа можно складывать, вычитать, умножать, делить, возводить в степень и извлекать корень, нельзя только их сравнивать. Комплексное число можно изобразить как точку на плоскости, у которой координата Х это действительная часть a, а Y это коэффициент при мнимой части b.

Функционально множество Мандельброта определяется как Zn+1=Zn*Zn+C. Для построения множества Мандельброта воспользуемся алгоритмом на Бейсике.

    For a=–2 to 2 ' для всех действительных а от –2 до 2

        For b=–2 to 2 ' для всех мнимых b от –2 до 2

        С=a+bi

        Z0=0+0i

        'Принадлежит множеству Мандельброта

        Lake=True

            'Повторяем 255 раз (для режима 256 цветов)

            For iteration=1 to 255

            Zn=Z0*Z0+C

            'Проверили – не принадлежит

                If abs(Zn)>2 then Lake=False: Exit For

                Z0=Zn

             Next

                'Нарисовали черную точку,принадлежащую "озеру" Мандельброта.

                If Lake=True Then PutPixel(a,b,BLACK)

                ' Нарисовали точку не принадлежащую множеству или лежащую на границе.

                Else PutPixel(a, b, iteration)

        Next

    Next

А теперь поясним программку словами. Для всех точек на комплексной плоскости в интервале от –2+2i до 2+2i выполняем некоторое достаточно большое количество раз Zn=Z0*Z0+C, каждый раз проверяя абсолютное значение Zn. Если это значение больше 2, что рисуем точку с цветом равным номеру итерации на котором абсолютное значение превысило 2, иначе рисуем точку черного цвета. Все множество Мандельброта в полной красе у нас перед глазами. 

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

Меняя функцию, условия выхода из цикла можно получать другие фракталы. Например, взяв вместо выражения С=a+bi выражение Z0=a+bi, а С присваивать произвольные значения мы получим множество Жюлиа, тоже красивый фрактал.

Для множества Мандельброта тоже проявляется самоподобие. 

 

Стохастические фракталы

 

Типичный представитель данного класса фракталов «Плазма» (Рис.5).

Рис. 5. Плазма.

 

Для ее построения возьмем прямоугольник и для каждого его угла определим цвет. Далее находим центральную точку прямоугольника и раскрашиваем ее в цвет равный среднему арифметическому цветов по углам прямоугольника плюс некоторое случайное число. Чем больше случайное число – тем более «рваным» будет рисунок. Если, например, сказать, что цвет точки это высота над уровнем моря, то получим вместо плазмы – горный массив. Именно на этом принципе моделируются горы в большинстве программ. С помощью алгоритма, похожего на плазму строится карта высот (Рис.6), к ней применяются различные фильтры, накладываем текстуру.

 

 Рис.6. Карта высот.

 

Системы итерируемых функций (IFS – Iterated Function Systems)

Эта группа фракталов получила широкое распространение благодаря работам Майкла Барнсли из технологического института штата Джорджия. Он пытался кодировать изображения с помощью фракталов. Запатентовав несколько идей по кодированию изображений с помощью фракталов, он основал фирму «Iterated Systems», которая через некоторое время выпустила первый продукт «Images Incorporated», в котором можно было изображения переводить из растровой формы во фрактальную FIF.

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

 

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

 

 Фракталы и хаос 

Понятие фрактал неразрывно связано с понятием хаос. Хаос – это отсутствие предсказуемости. Хаос возникает в динамических системах, когда для двух очень близких начальных значений система ведет себя совершенно по–разному. Пример хаотичной динамической системы – погода (метеорологи шутят: «Взмах крыла бабочки в Техасе приводит к урагану во Флориде»). 

Хорошо проиллюстрировать хаотичное поведение можно с помощью так называемого logistic equation (логистического уравнения) x=c*x(1–x). Пришло это выражение из биологии, т.к. это грубая модель популяции животных. Так вот при исследовании поведения этой функции выяснилась интересная ее особенность. Если с – фактор роста популяции находится в пределах от 1 до 3, то через некоторое количество итераций популяция стабилизируется.

 

Рис. 7. Зависимость поведения функции от величины с.

 

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

При с=3.45 она раздваивается снова и у нас уже имеется четырехлетний цикл.

Далее при росте с функция раздваивается все быстрее и быстрее: при с=3.54, с=3.564, с=3.569 ...

И в точке 3.57 начинается хаос. Значения выражения не имеют какой либо периодичности или структуры. На рисунке 7 изображена зависимость поведения функции от величины с.