1) Регулярные фракталы Интуитивно можно констатировать, что свойства природных фрактальных объектов чрезвычайно разнообразны и сложны, в силу чего для их исследования используются модельные фракталы, сгенерированные по специальным алгоритмам. Такие искусственные фрактальные объекты носят название "регулярные фракталы". Количественной характеристикой фрактала является фрактальная размерность. Для выяснения смысла этого фрактального показателя решим несложную задачу. Требуется подсчитать длину ломаной линии, полученной преобразованием отрезка единичной длины (рис. 2.5.). Алгоритм преобразования следующий: 1. отрезок единичной длины (рис. 11а) делится на 3 части, средняя часть отрезка отбрасывается и заменяется ломаной, состоящей из 2 отрезков длины 1/3 (рис. 2.5.б); 2. каждый прямой отрезок полученной ломаной преобразуется согласно пункту 1, и мы получаем более изощренную ломаную линию, показанную на рис. 2.5.в; 3. пункты 1 и 2 повторяются до исчерпания технических возможностей чертежного приспособления (рис. 2.5.д). Если продолжить этот процесс до бесконечности, мы получим линию, называемую кривой Кох. Поскольку на каждом шаге мы разбивали каждый отрезок на три части, точнее она называется триадной кривой Кох. Ведь каждый отрезок можно разбивать и на большее количество частей. На первом шаге алгоритма длина отрезка а составляет 1/3 от первоначальной. Тогда длина кривой Кох вычисляется просто L= 4*1/3 = 4/3 = 1,33 (2.2) Рис. 2.5. Этапы построения линейного регулярного На втором шаге алгоритма длина элементарного фрактала - триадной кривой Коха отрезка а=1/9, длина кривой L= 16*1/9 = 16/9 = 1,777 (2.3) На третьем шаге алгоритма а=1/27 L= 64*1/27 = 64/27 = 2,370370 (2.4) и т.д. Можно заметить, что с увеличением n длина элементарного отрезка а ® 0, а длина кривой L стремится к бесконечности: L= (4/3)n (2.5) a= (1/3)n (2.6) где n= 1,2,3. Выражая n из (2.6), получаем: n= (1/ln3)*ln(1/a). Подставляя n в (2.5), получим L= exp(n*ln(4/3))=exp((ln(4/3)/ln3)*ln(1/a) (2.7) Обозначив D= ln4/ln3, получаем L=a*(1/a)D-1 (2.8) Из последнего соотношения видно, что постоянным показателем остается только величина D, поскольку она не зависит от масштаба измерения и является характеристикой данной линии "кривая Кох". Она называется фрактальной размерностью. С геометрической точки зрения фрактальная размерность является показателем того, на сколько плотно эта линия заполняет плоскость или пространство. Аналогичным образом можно рассчитать фрактальную размерность других регулярных фракталов, например, плоского регулярного фрактала - салфетки Серпинского (рис. 2.6.). Рис. 2.6. Этапы построения плоскогорегулярного фрактала - салфетки Серпинского Кривую Кох можно растянуть в прямую линию, поэтому ее топологическая размерность равна единице. Фрактальная размерность кривой Кох D=ln4/ln3 » 1,263 больше топологической размерности. Таким образом кривая является структурой, отличной от линии, но еще не ставшей плоскостью. Похожий алгоритм используется для построения салфетки Серпинского (рис. 2.6.). Здесь из середины плоского треугольника вырезается треугольник с длиной стороны, равной половине длины стороны исходного треугольника. Фрактальная размерность этого построения лежит между 1 и 2. 2) Мультифракталы Фракталы неизмеримо расширили наши возможности описания природы. Абстрактные конструкции Кантора, Коха, Больцано снабдили нас моделями реальности гораздо более реалистичными, чем Евклидова геометрия. Однако в физике, химии, геологии (и в некоторых других науках) мы сталкиваемся со многими явлениями, требующими расширения понятия фрактала на более сложные структуры. Для полной характеристики этих неоднородных объектов требуется уже не одна, в отличие от регулярных фракталов, а целый спектр фрактальных размерностей, число которых в общем случае бесконечно. Причина этого заключается в том, что наряду с чисто геометрическими характеристиками, определяемыми размерностью Хаусдорфа, такие фракталы обладают некоторыми статистическими свойствами. Многие странные аттракторы нелинейных динамических систем также обладают ярко выраженной мультифрактальной структурой. Проще всего пояснить, что подразумевается под "неоднородным фракталом" на примере треугольника Серпинского, полученного с помощью метода случайных итераций. Известно, что система итерируемых функций для этого фрактала состоит из трех равновероятных линейных преобразований (вероятность=1/3). Перераспределим вероятности следующим образом: на одно преобразование пусть приходится 90%, на остальные два по 5%. Таким образом, получится треугольник Серпинского, точки которого распределены крайне неравномерно. Большая часть собрана у одной вершины и ее прообразов. В то время как у других вершин (и их прообразов) их крайне мало. Тем не менее, фрактальная размерность этого объекта равна фрактальной размерности классического треугольника Серпинского (т.е. с равновероятными преобразованиями) и равна D=ln3/ln2. Такое совпадение и заставляет нас заняться поиском новых характеристик, которые отличали бы неравномерное распределение точек от равномерного. 3) Стохастические фракталы Природные объекты часто имеют фрактальную форму. Для их моделирования могут применяться стохастические (случайные) фракталы. Примеры стохастических фракталов: траектория броуновского движения на плоскости и в пространстве; граница траектории броуновского движения на плоскости. В 2001 году Лоулер, Шрамм и Вернер доказали предположение Мандельброта о том, что её размерность равна 4/3. эволюции Шрамма-Лёвнера — конформно-инвариантные фрактальные кривые, возникающие в критических двумерных моделях статистической механики, например, в модели Изинга и перколяции. различные виды рандомизированных фракталов, то есть фракталов, полученных с помощью рекурсивной процедуры, в которую на каждом шаге введён случайный параметр. Плазма — пример использования такого фрактала в компьютерной графике. Фрактальная монотипия, или стохатипия — направления в изобразительном искусстве, заключающиеся в получении изображения случайного фрактала. 4) Системы итерируемых функций (IFS - Iterated Function Systems) Эта группа фракталов получила широкое распространение благодаря работам Майкла Барнсли из технологического института штата Джорджия. Он пытался кодировать изображения с помощью фракталов. Запатентовав несколько идей по кодированию изображений с помощью фракталов, он основал фирму "Iterated Systems", которая через некоторое время выпустила первый продукт "Images Incorporated", в котором можно было изображения переводить из растровой формы во фрактальную FIF. Это позволяло добиться высоких степеней сжатия. При низких степенях сжатия качество рисунков уступало качеству формата JPEG, но при высоких картинки получались более качественными. В любом случае этот формат не прижился, но работы по его усовершенствованию ведутся до сих пор. Ведь этот формат не зависит от разрешения изображения. Так как изображение закодировано с помощью формул, то его можно увеличить до любых размеров и при этом будут появляться новые детали, а не просто увеличится размер пикселей. Хуже это или лучше - решать надо в каждом отдельном случае. Если в L-systems (алгебраических фракталах) речь шла о замене прямой линии неким полигоном, то в IFS мы в ходе каждой итерации заменяем некий полигон (квадрат, треугольник, круг) на набор полигонов, каждый их которых подвергнут аффинным преобразованиям. При аффинных преобразованиях исходное изображение меняет масштаб, параллельно переносится вдоль каждой из осей и вращается на некоторый угол. В результате можно получить потрясающие коэффициенты сжатия. Например рисунок папоротника кодируется с помощью 28!!! цифр и один и тот же рисунок получается в не зависимости от того что взяли за основу - прямоугольник, круг, треугольник или что-либо еще. Но к сожалению процесс создания набора коэффициентов для произвольного изображения очень трудоемок и занимает очень много времени. 2.2 Сжимающие аффинные преобразования Прежде чем раскрывать смысл понятия - сжимающие аффинные преобразования, рассмотрим линейное преобразование на комплексной плоскости Z, которое переводит равносторонний треугольник с длиной стороны равной единице в равносторонний треугольник в два раза меньшего размера представленный на рис.2.1 Рисунок 2.1 - Преобразование f Рассмотренное выше линейное преобразование на комплексной плоскости является частным случаем аффинного преобразования плоскости xn+1=a*xn+b*yn+e yn+1=c*xn+d*yn+f Его можно представить в матричном виде Так, например, рассмотренное преобразование можно записать в виде 5) Основы фрактального сжатия изображений из песочницы Фракталы — удивительные математические объекты, подкупающие своей простотой и богатыми возможностями по построению объектов сложной природы при помощи всего лишь нескольких коэффициентов и простой итеративной схемы. Метрика — функция, заданная на пространстве, возвращающая расстояние между двумя точками этого пространства. Например, привычная нам Эвклидова метрика. Если на пространстве задана метрика, оно называется метрическим. Метрика должна удовлетворять определенным условиям, но не будем углубляться. Сжимающее отображение (преобразование) — функция на метрическом пространстве, равномерно уменьшающая расстояние между двумя точками пространства. Например, y=0.5x. Сжимающие отображения обладают важным свойством. Если взять любую точку и начать итеративно применять к ней одно и то же сжимающее отображение: f(f(f...f(x))), то результатом будет всегда одна и та же точка. Чем больше раз применим, тем точнее найдем эту точку. Называется она неподвижной точкой и для каждого сжимающего отображения она существует, причем только одна. Несколько аффинных сжимающих отображений образуют систему итерированных функций (СИФ). По сути, СИФ — это множительная машина. Она принимает исходное изображение, искажает его, перемещает, и так несколько раз. Например, вот так при помощи СИФ из трех функций строится треугольник Серпинского: Исходный треугольник три раза множится, уменьшается и переносится. И так далее. Если так продолжать до бесконечности, получим известный фрактал площадью 0 и размерностью 1,585. Если функции, входящие в СИФ,— сжимающие, то сама СИФ тоже имеет неподвижную точку. Вот только эта «точка» будет уже не привычной нам точкой в N-мерном пространстве, а множеством таких точек, то есть изображением. Оно называется аттрактором СИФ. Для СИФ, приведенной выше, аттрактором будет треугольник Серпинского. Тут мы переходим на следующий уровень — в пространство изображений. В этом пространстве: Точка пространства — это изображение. Расстояние между точками показывает, насколько похожи изображения между собой, насколько «близки» (естественно, если его задать соответствующим образом). Сжимающее отображение делает два любых изображения более похожими (в смысле заданной метрики). Имея СИФ, найти аттрактор просто. Во всяком случае, имея под рукой компьютер. Можно взять абсолютно любое начальное изображение и начать применять к нему СИФ. Пример с тем же треугольником, но уже построенным из квадрата: Получается, что для построения довольно сложной фигуры нам потребовалось 18 коэффициентов. Выигрыш, как говорится, налицо. Вот если бы мы умели решать обратную задачу — имея аттрактор, строить СИФ… Тогда достаточно взять аттрактор-изображение, похожее на фотографию вашей кошки и можно довольно выгодно его закодировать. Вот здесь, собственно, начинаются проблемы. Произвольные изображения, в отличие от фракталов, не самоподобны, так что так просто эта задача не решается. Как это сделать придумал в 1992 году Арнольд Жакин, в то время — аспирант Майкла Барнсли, который считается отцом фрактального сжатия. Самоподобие нам нужно обязательно — иначе ограниченные в своих возможностях аффинные преобразования не смогут правдоподобно приблизить изображения. А если его нет между частью и целым, то можно поискать между частью и частью. Примерно так, видимо, рассуждал и Жакин. Упрощенная схема кодирования выглядит так: Изображение делится на небольшие неперекрывающиеся квадратные области, называемые ранговыми блоками. По сути, разбивается на квадраты. См. картинку ниже. Строится пул всех возможных перекрывающихся блоков в четыре раза больших ранговых — доменных блоков. Для каждого рангового блока по очереди «примеряем» доменные блоки и ищем такое преобразование, которое делает доменный блок наиболее похожим на текущий ранговый. Пара «преобразование-доменный блок», которая приблизилась к идеалу, ставится в соответствие ранговому блоку. В закодированное изображение сохраняются коэффициенты преобразования и координаты доменного блока. Содержимое доменного блока нам ни к чему — вы же помните, нам все равно с какой точки стартовать. На картинке ранговый блок обозначен жёлтым, соответствующий ему доменный — красным. Также показаны этапы преобразования и результат. Декодирование же производится просто и довольно быстро. Берем любое изображение, делим на ранговые области, последовательно заменяем их результатом применения соотв. преобразования к соотв. доменной области (что бы она ни содержала в данный момент). После нескольких итераций исходное изображение станет похоже на себя: 6) L-системы Понятие L-систем, тесно связанное с самоподобными фракталами, появилось только в 1968 году благодаря Аристриду Линденмайеру. Изначально L-системы были введены при изучении формальных языков, а также использовались в биологических моделях селекции. С их помощью можно строить многие известные самоподобные фракталы, включая снежинку Коха и ковер Серпинского. Некоторые другие классические построения, например кривые Пеано (работы Пеано, Гильберта, Серпинского), также укладываются в эту схему. И конечно, L-системы открывают путь к бесконечному разнообразию новых фракталов, что и послужило причиной их широкого применения в компьютерной графике для построения фрактальных деревьев и растений. Рассмотренные в данной курсовой работе L-системы ограничиваются случаем детерминированных L-систем и графикой на плоскости. Для графической реализации L-систем в качестве подсистемы вывода используется так называемая тертл-графика (turtle – черепаха). При этом точка (черепашка) движется по экрану дискретными шагами, как правило прочерчивая свой след, но при необходимости может перемещаться без рисования. В нашем распоряжении имеются три параметра (x,y,a), где (x,y) --- координаты черепашки, a --- направление, в котором она смотрит. Черепашка обучена интерпретировать и выполнять последовательность команд, задаваемых кодовым словом, буквы которого читаются слева направо. Кодовое слово представляет собой результат работы L-системы и может включать следующие буквы: F --- переместиться вперед на один шаг, прорисовывая след. b --- переместиться вперед на один шаг, НЕ прорисовывая след. [ --- открыть ветвь (подробнее см. ниже) ] --- закрыть ветвь (подробнее см. ниже) + --- увеличить угол a на величину q - --- уменьшить угол a на величину q Размер шага и величина приращения по углу q задаются заранее и остаются неизменными для всех перемещений черепашки. Если начальное направление движения а (угол, отсчитываемый от положительного направления оси Х) не указано, то полагаем а равным нулю. Несколько примеров иллюстрируют применение команд ветвления (обозначаются ],[) и вспомогательных переменных (обозначаются X, Y, и т.д.). Команды ветвления используются для построения деревьев растений, а вспомогательные переменные заметно облегчают построение некоторых L-систем. Формально, детерминированная L-система состоит из алфавита, слова инициализации, называемого аксиомой или инициатором, и набора порождающих правил, указывающих, как следует преобразовывать слово при переходе от уровня к уровню (от итерации к итерации). К примеру, можно заменять букву F при помощи порождающего правила newf = F-F++F-F, что соответствует L-системе для снежинки Коха, рассматриваемой ниже. Символы +, -, ], [ не обновляются, а просто остаются на тех местах, где они встретились. Обновление букв в данном слове предполагается одновременным, то есть буквы слова одного уровня обновляются раньше любой буквы следующего уровня. L-система, соответствующая снежинке Коха (рис. 2.2.1), задается следующим образом: p = p/3 Аксиома: F++F++F Порождающее правило: newf = F-F++F-F Графическое представление аксиомы F++F++F --- равносторонний треугольник. Черепашка делает один шаг вперед, затем угол а увеличивается на 2p/3 и черепашка делает еще один шаг. На первом шаге каждая буква F в слове-инициаторе F++F++F заменяется на F-F++F-F: (F-F++F-F)+(F-F++F-F)+(F-F++F-F) Повторяя этот процесс, на втором шаге получим: F-F++F-F-F-F++F-F++F-F++F-F-F-F++F-F+F-F++F-F-F-F++F-F++F-F++F-F-F-F++F-F+ F-F++F-F- FF++F-F++F-F++F-F-F-F++F-F и т.д. Причем, убедившись на собственном опыте программирования L-систем знаю, что для снежинки Коха на 20-й итерации порождающее правило занимает несколько мегабайт текста ! Вот еще некоторые фракталы, построенные с использованием L-системы: Рис. 3.1. Дракон Хартера-Хатвея после 12-ти итераций joinstyle="miter"eqn="if lineDrawn pixelLineWidth 0" и его L-система: p = p/4 Аксиома: FX Порождающее правило: newf = F newx = X+YF+ newy = -FX-Y Рис 3.2. Дерево после 5-ти итераций и его L-система: p = p/7 Аксиома: F Порождающее правило: newf = F[+F]F[-F]F