Фракталы и синтез изображений
Классический пример фрактального множества - триадная кривая Кох. Основные способы построения фракталов, их сущностная характеристика. Пример построения дерева с помощью L-системы. Системы итерирующих функций (IFS). Программа фрактального морфинга.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | реферат |
Язык | русский |
Дата добавления | 28.08.2013 |
Размер файла | 258,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Фракталы и синтез изображений
Введение
Фракталы встречаются везде, где заканчиваются правильные формы евклидовой геометрии. Все, что создано человеком, ограничено плоскостями. Если встречается природный объект, то с первого взгляда видно, что осознать, описать его форму со всеми шероховатостями можно только приблизительно. Здесь на помощь приходят фракталы.
Термин "фрактал" (от английского слова "fraction" - дробь) введен бельгийским математиком Бенуа Мандельбротом и обозначает множество, имеющее дробную фрактальную размерность. Для пояснения фрактальной размерности необходимо ввести понятие топологической размерности. Под топологической размерностью Dt множества в линейном пространстве понимают число линейно независимых координат в пространстве. Например, окружность и линия имеют топологическую размерность 1; круг и квадрат - 2; шар и куб - 3. Фрактальная размерность множества D - размерность того пространства, которое полностью заполняется множеством. Для связи фрактальной и топологической размерностей используют показатель Херста Н, вычисляемый по формуле: H = D - Dt. Фракталом называют множество, фрактальная размерность которого не совпадает с топологической. Например, для кривых Пеано (кривые, заполняющие плоскость) Dt = 1, D = 2.
Рассмотрим классический пример фрактального множества - триадную кривую Кох (рис. 1).
Рис. 1. Построение триадной кривой Кох
Построение кривой начинается с единичного отрезка, который называется инициатором и является предфракталом 0-го порядка. Далее инициатор заменяется на образующий элемент - кривую из четырех прямолинейных звеньев, каждое из которых имеет длину 1/3. Так образуется предфрактал 1-го порядка. Его длина равна 4/3. Для построения предфрактала следующего порядка каждое звено заменяется на уменьшенный образующий элемент. В результате получаем кривую, состоящую из 4 x 4 = 16 звеньев, каждое из которых имеет длину (1/3) / 3 = 1/9, общая длина равна 16/9. Длина предфрактала n-го порядка равна (4/3) в степени n. Очевидно, что предел длины кривой при n, стремящемся к бесконечности, равен бесконечности. В итоге получили кривую бесконечной длины, заполняющую ограниченное множество на плоскости, что само по себе очень любопытно. Если построение кривой начинать не с отрезка, а с треугольника, и применить вышеперечисленные построения к каждой его стороне, то получим "снежинку" Кох (рис. 2).
Рис. 2. "Снежинка" Кох (Предфрактал 4-го порядка)
Эта фигура интересна тем, что ее периметр - линия бесконечной длины - ограничивает конечную площадь. В [3] показано, что фрактальная размерность триадной кривой Кох D равна ln4/ln3, то есть D является дробным числом, находящимся между 1 и 2.
1. L - системы
Существуют два основных способа построения фракталов.
Первый способ - использование L-систем (от имени Lindenmayer), второй способ - применение системы IFS (iterated function systems). L-система - это грамматика некоторого языка (достаточно простого), которая описывает инициатор и преобразование, выполняемое над ним, при помощи средств, аналогичных средствам языка Лого (аксиоматическое описание простейших геометрических фигур и допустимых преобразований на плоскости и в пространстве). Приведем фрагмент программы, задающей построение кривой Кох в формате L-системы для программы FRACTINT:
Koch {
Angle 6 // Задается угол поворота 360 / 6 = 60.
Axiom F // Это инициатор в виде отрезка (F - вперед).
F=F+F--F+F // Функция (+ влево, - вправо).
}
Подобные L-системы применяются в пакете Autodesk 3D Studio для описания цветов и других растений (рис. 3, 4).
Рис. 3. Пример построения дерева с помощью L - системы
Рис. 4. Дерево в пространстве
Приведем фрагмент программы, задающей построение дерева в формате L-систем для программы FRACTINT:
Tree1 { ; Adrian Mariano
; from The Fractal Geometry of Nature by Mandelbrot
angle=12;
axiom +++FX
X=@.6[-FX]+FX
}
Отметим, что L-системы предназначены для генерирования предфракталов заданного порядка. Это свойство отличает их от IFS, которые предназначены для построения самих фракталов.
2. Системы итерирующих функций (IFS)
Система итерирующих функций - это совокупность сжимающих аффинных преобразований. Как известно, аффинные преобразования включают в себя масштабирование, поворот и параллельный перенос. Аффинное преобразование считается сжимающим, если коэффициент масштабирования меньше единицы.
Рассмотрим подробнее построение кривой Кох с использованием аффинных преобразований. Каждый новый элемент кривой содержит четыре звена, полученных из образующего элемента использованием масштабирования, поворота и переноса.
1. Для получения первого звена достаточно сжать исходный отрезок в три раза. Следует отметить, что то же масштабирование применяется для всех звеньев.
2. Следующее звено строится с использованием всех возможных преобразований, а именно: сжатие в три раза, поворот на - 60о и параллельный перенос на 1/3 по оси X.
3. Третье звено строится аналогично второму: сжатие в три раза, поворот на 60о, параллельный перенос на 2/3 по оси X.
4. Последнее звено: сжатие в три раза, параллельный перенос на 2/3 по оси X.
В дальнейшем правила построения кривой Кох будем называть IFS для кривой Кох.
Теперь мы можем найти систему итерирующих функций для описания кривой Кох. Осталось только произвести суперпозицию аффинных преобразований - масштабирования, поворота и параллельного переноса.
Из курса линейной алгебры известна формула вычисления новых координат x',y' при аффинных преобразованиях:
x` = x * а - y * b + e
y` = x * c + y * d + f
Здесь
a = cos (alpha) * scale_x,
b = sin (alpha) * scale_x,
c = sin (alpha) * scale_y,
d = cos (alpha) * scale_y,
e = move_x,
f = move_y,
где:
scale_x - масштабирование по оси X;
scale_y - масштабирование по оси Y;
alpha - угол поворота;
move_x - параллельный перенос по оси X;
move_y - параллельный перенос по оси Y.
Полученные коэффициенты a, b, c, d, e, f для каждого звена и составят требуемую систему итерирующих функций.
Вычислим коэффициенты аффинного преобразования IFS для кривой Кох.
1. Для первого звена коэффициенты аффинного преобразования будут следующими:
a = 0.3333, b = 0.0000, c = 0.0000, d = 0.3333, e = 0.0000, f = 0.0000.
Полученное аффинное преобразование является масштабированием на коэффициент 1/3=0,3333.
2. Вычислим коэффициенты преобразования для второго звена:
a = 0.1667, b = -0.2887, c = 0.2887, d = 0.1667, e = 0.3333, f = 0.0000.
3. Коэффициенты для третьего звена будут такими:
a = -0.1667, b = 0.2887, c = 0.2887, d = 0.1667, e = 0.6666, f = 0.0000.
4. И наконец, коэффициенты преобразования для последнего звена:
a = 0.3333, b = 0.0000, c = 0.0000, d = 0.3333, e = 0.6666, f = 0.0000.
Коэффициенты для первого и последнего звеньев кривой Кох практически идентичны и отличаются только параллельным переносом по оси X (коэффициент e).
Второе и третье преобразования включают в себя не только масштабирование и перенос, но и поворот на 60 С и -60 С. Здесь коэффициенты вычисляются так:
0.1667 = cos (60) * 1/3,
-0.2887 = -sin (60) * 1/3.
Приведем матрицу вычисленных коэффициентов, задающих кривую Кох в формате IFS для программы FRACTINT.
Koch {
0.3333 0.0000 0.0000 0.3333 0.0000 0.0000 0.25
0.3333 0.0000 0.0000 0.3333 0.6666 0.0000 0.25
0.1667 -0.2887 0.2887 0.1667 0.3333 0.0000 0.25
-0.1667 0.2887 0.2887 0.1667 0.6666 0.0000 0.25
}
Вычисление первых шести параметров было проведено выше. Значение последнего (седьмого) параметра каждого преобразования пропорционально площади, занимаемой звеном. Сумма последних параметров для всех преобразований равна единице. В нашем примере размеры звеньев равны, поэтому седьмой параметр равен 1/4=0.25 для всех звеньев. В том случае, если оценить приблизительно размеры не удается, можно использовать формулу вычисления площади p = abs (a * d - b * c) [3]. Следует учитывать то, что эта формула дает не нормализованный результат. Поэтому нам придется еще приводить сумму к единице. Проверим формулу на нашем примере, используя коэффициенты, задающие кривую Кох в формате IFS для программы FRACTINT:
1: 0.3333 * 0.3333 - 0.0000 * 0.0000 = 0.111
2: 0.3333 * 0.3333 - 0.0000 * 0.0000 = 0.111
3: 0.1667 * 0.1667 + 0.2887 * 0.2887 = 0.111
4: -0.1667 * 0.1667 - 0.2887 * 0.2887 = 0.111
Теперь подбором нормирующего множителя можно нормализовать значение седьмого параметра до значения 0.25. Седьмой параметр применяется при построении фрактала с использованием IFS. Если для построения фрактала используем систему итерирующих функций, получаем изображение, деталировка которого ограничена только разрешением устройства отображения, в отличие от построения, основанного на L-системе, где точность зависит от заданного порядка предфрактала. Чтобы получить высокое разрешение с использованием L-систем, необходимо задавать большой порядок предфрактала. Но так как построение основано на рекурсивном алгоритме, соответственно получается большая глубина рекурсии и, как следствие, замедление построения.
На этом можно было и завершить описание IFS. Все необходимое для получения систем, итерирующих функций, изложено, а строить фракталы по IFS можно с использованием программы FRACTINT. Метод, основанный на IFS, в отличие от L-систем считается перспективным методом синтеза фракталов, а также сжатия изображений. Рассмотрим, каким образом FRACTINT и аналогичные программы используют IFS для построения фракталов.
Для синтеза фрактала выбирается начальная точка, к которой применяется случайным образом выбранное из IFS преобразование, в результате чего точка перемещается в другой конец экрана. Эта операция повторяется много раз (достаточно 100 итераций), и через некоторое время точка начинает блуждать по аттрактору, (аттрактор - множество всех возможных траекторий), который и будет представлять собой изображение фрактала. Каждое новое положение точки окрашивается цветом, отличным от фона. Существует теорема, доказывающая, что полученный аттрактор будет замкнутым. Для того, чтобы блуждающая точка окрашивала новые пикселы, а не блуждала по старым, используют седьмой параметр, который представляет собой вероятность появления конкретного аффинного преобразования из набора преобразований IFS. Если выбрать начальную точку так, чтобы она сразу оказалась на аттракторе, то она начинает блуждать в области этого аттрактора, не перемещаясь в другие области экрана. Рассматривая каждое преобразование в отдельности, можем заметить, что где бы мы ни начинали, после нескольких итераций, точка перестанет двигаться по экрану. Точка остановки называется неподвижной точкой - это решение системы линейных уравнений двух переменных, которое находится методом простой итерации. Неподвижная точка каждого преобразования входит в состав аттрактора. Поэтому за начальную точку при построении фрактала можно взять неподвижную точку первого преобразования из набора IFS. На рис. 5 изображена кривая Кох, построенная при помощи метода IFS.
Рис. 5. Изображение кривой Кох, полученное с использованием IFS
Увеличивая разрешение устройства отображения или масштаб, можно увидеть новые части фрактала, которые будут похожи на весь фрактал.
Это самый важный признак фрактала - самоподобность.
На рис. 6 показано масштабирование треугольника Серпинского.
Рис. 6. Масштабирование треугольника Серпинского
3. Фрактальный морфинг
Если есть описание еще одного фрактала в формате IFS, например листа папоротника, можно произвести морфинг (непрерывное преобразование одного в другой). Приведем фрагмент программы, задающий лист папоротника в формате IFS в пакете FRACTINT (см. рис. 7.).
Рис. 7. Изображение листа папоротника, полученное с помощью IFS
Fern {
0 0 0 .16 0 0 .01
.85 .04 -.04 .85 0 1.6 .85
.2 -.26 .23 .22 0 1.6 .07
-.15 .28 .26 .24 0 .44 .07
}
Для осуществления морфинга достаточно линейно интерполировать элементы одной матрицы в те же элементы другой и строить фракталы для каждого из промежуточных состояний. Чтобы получить лучший визуальный эффект, нужно продумать положение строк в матрицах. При выводе одного фрактала этот факт не играет роли. При построении разных фракталов с использованием IFS можно отметить, что они все имеют разные размеры, и поэтому нуждаются в масштабировании (cм. приложение). На рис. 8 приведен пример фрактального морфинга.
Рис. 8. Пример фрактального морфинга "дерева" в "лист папоротника"
4. Фрактальное сжатие изображений
При помощи фракталов можно сжимать произвольные изображения с некоторой потерей качества, аналогично сжатию JPEG. Правда, фрактальное сжатие дает лучшие результаты. Методы компрессии, основанные на RLE, Huffman или LZW, не учитывают природы сжимаемых данных и поэтому дают неудовлетворительные результаты при обработке изображений. При фрактальном сжатии изображение переводится в формат IFS, который значительно экономнее, чем просто BITMAP или LZW.
Сжатие JPEG основано на дискретном синусно-косинусном преобразовании (дискретное преобразование Фурье), которое переводит изображение в амплитудно-фазовую форму. Искажения в области высоких частот не сильно влияют на качество исходных изображений, поэтому их частично отбрасывают, а частично фильтруют НЧ-фильтром с последующим сжатием при помощи RLE и тому подобных методов. Поэтому метод JPEG дает плохие результаты на изображениях, содержащих тонкие линии (текст или чертежи). Для того, чтобы получить прямоугольный сигнал, а тонкая линия именно таким сигналом и является, необходимо использовать область высоких частот, которые в нашем случае фильтруются, подвергаясь при этом искажению.
Основная проблема фрактального сжатия - это то, что компрессия-декомпрессия производится быстро и однозначно, в то время как прямая процедура требует от машины больших интеллектуальных возможностей. Правильное сжатие - это серьезная задача, решение которой можно найти в науке о распознавании образов.
Сжатие происходит следующим образом. Изображение разбивается на части множеством R и покрывается множеством D. Причем элементы множества D больше по площади, чем R. Для каждого элемента Ri перебираются все элементы множества D и строится аффинное преобразование R(i) -> D(j). Из всех преобразований выбирается одно, которое происходит с наименьшей погрешностью. Аффинное преобразование выполняется по трем координатам - X, Y, Цвет. Приведем это преобразование:
x = a b 0 * x + e
y = c d 0 * y + f
c = 0 0 s c o
a, b, c, d, e, f - коэффициенты преобразования на плоскости.
s - контрастность.
o - яркость.
Остальные коэффициенты равны 0, потому что нет необходимости связывать изменение цвета с преобразованием координат. От числа преобразований, то есть мощности множества R, зависит степень компрессии, ведь на каждое преобразование требуется 8 чисел. Множество таких преобразований и составляет систему итерирующих функций .
Разбиение на R и покрытие D являются самой сложной частью алгоритма. В простейшем случае это делается так: изображение разбивают регулярной сеткой R(i) по 8 x 8 пикселов. Для каждого R(i) перебирают все возможные D(j) по 16 x 16 (причем есть 8 вариантов для каждого квадрата - 4 поворота на 90 С и зеркальная симметрия). Для каждого R(i) вводят свое лучшее преобразование, а потом ищут минимальное покрытие исходного изображения из имеющихся D(j). Оставляют только те преобразования, которые нужны для минимального покрытия.
Декомпрессия производится следующим образом. Выбирают начальное изображение, из которого будут строить оригинал. Самое удивительное, что от выбора начального изображения меняется только скорость стабилизации изображения, то есть время декомпрессии. В настоящее время мне не известны способы оптимального выбора инициатора, поэтому заполним его случайными числами или константой. К каждому элементу множества R (то есть квадрату 8x8 из инициатора) применяют случайно выбранное аффинное преобразование из имеющейся системы функций. В результате такого действия элементы изображения копируются в другие части экрана с изменением ориентации, яркости и контраста. После того, как все R(i) перебраны, начинаем все сначала. По теореме о системе сжимающих аффинных преобразований, описанной в статье [7], изображение будет стремиться к стабильности. Обычно достаточно 10.. 20 итераций.
При компрессии можно не сохранять оригинальные размеры изображения, достаточно просто запомнить их соотношение. А при декомпрессии - задавать те размеры, которые нам больше подходят. Такая возможность позволяет решить задачу экстраполяции исходного изображения. При установке новых размеров, превышающих старые, в новое изображение добавятся элементы, подобные другим элементам изображения. И если обрабатывается природный объект (например гранитный камень), то подмена не будет заметна.
5. Программа фрактального морфинга
Здесь приведена программа фрактального морфинга, состоящая из двух файлов - IFS.CC и PTR.H. К ней приложен файл данных IFS.IFS, в котором находятся описания нескольких фракталов в формате FRACTINT. При запуске программа строит изображение первого фрактала и ожидает нажатия клавиш '+' или '-', с помощью которых можно перейти к изображению второго фрактала и обратно за 10 шагов. Имена фракталов передаются в командной строке. Например:
C:\>morph fern tree
Для компиляции использовался компилятор Watcom C++/32 ver 10. Переделка программы для других компиляторов вряд ли добавит кому-то проблем.
Ключевая процедура программы - render( ), строит изображение фрактала по IFS. Процедура scale( ) аналогична предыдущей, только она не рисует, а формирует масштабные коэффициенты. Эти функции пользуются подпрограммами root( ) - нахождение неподвижной точки методом простой итерации и affine( ) - аффинное преобразование координат. Loadifs( ) - считывает описание фрактала в текстовом формате программы FRACTINT. Процедура morph( ) производит линейную интерполяцию между двумя IFS.
Кроме литературы были использованы программы:
FRACTINT - программа представляет коллекцию средств для синтеза всевозможных фракталов;
Vista Pro - детально проработанная программа для синтеза ландшафтов, состоящих из гор, долин, морей, деревьев и облаков;
Planet Generator - небольшая программа, которая с помощью простых средств строит изображения "лунных" пейзажей;
Generato - комплекс программ, предназначенный для тестирования трассировщиков лучей, где меня интересовал только синтезатор деревьев;
POLY Ray - трассировщик лучей (работает быстрее, чем POV Ray).
6. Программа синтеза фракталов
фрактал морфинг кох
//
// IFS morph.
//
// morph.cc
//
// (C) 1996 Artyom Sunduchkov.
//
#include "ptr.h"
#include <stdio.h>
#include <bios.h>
#include <graph.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define max(a,b) ((a)>(b))?(a):(b)
#define min(a,b) ((a)>(b))?(b):(a)
short MX, MY;
float min_x, min_y, delta_x, delta_y;
void root( float* col, float& x, float& y );
void affine( float& x, float& y, float* col );
short loadifs( float* ifs, char* name );
void scale( float* ifs, short n );
void render( float* ifs, short n );
void morph( float* ifs, float* ifs1, float* ifs2, short n, float
phase );
void main( int argc, char** argv )
{ printf( "\n+-----------------------------------------+\n"
"¦ >>> FRACTAL <<< morph. ¦\n"
"¦ ¦\n"
"+-----------------------------------------+\n\n" );
if( argc < 3 ) {
printf( "Use: morph <fractal 1> <fracatal 2>\n" );
return; }
float ifs1[ 4*7 ], ifs2[ 4*7 ];
if( !loadifs( ifs1, argv[ 1 ] ) || !loadifs( ifs2, argv[ 2 ] )
)
{ printf( "Can't load fractals.\n" ); return;
}
_setvideomode( _VRES16COLOR );
if( _grstatus( ) != _GROK ) return;
videoconfig vc;
_getvideoconfig( &vc );
MX = vc.numxpixels - 1;
MY = vc.numypixels - 1;
_setcolor( 10 );
float min_x, min_y, delta_x, delta_y;
float phase = 0.0, df = 0.0;
float ifs[ 4*7 ];
short quit = 0;
while( !quit )
{ morph( ifs, ifs1, ifs2, 4, phase ); scale( ifs, 4 );
_clearscreen( 0 ); render( ifs, 4 );
switch( _bios_keybrd( 0 ) )
{ case 283: quit = !0;
break; case 18989: df = -0.1;
break; case 20011: df = 0.1;
break; default: df = 0.0;
}
phase += df; }
_setvideomode( _TEXTC80 ); } // main( ).
short loadifs( float* ifs, char* name )
{ FilePtr fractals( "IFS.IFS", "rt" ); if( !fractals ) {
printf( "Can't open file IFS.IFS\n" );
return 0; }
char a;
char name0[ 256 ];
do
{ while( !isalpha(a = fgetc(fractals)) && a != '*' ); if( a ==
'*' ) {
printf( "Fractal %s not found.\n", name );
return 0; } ungetc( a, fractals ); fscanf( fractals,
"%s", name0 );
} while( strcmp( name, name0 ) );
while( ((a = fgetc(fractals)) != '{') && a != EOF );
if(a != '{')
{ printf( "Syntax error near %s.\n", name ); return 0;
}
short n = 0;
float* col = ifs;
while( fscanf( fractals," %f %f %f %f %f %f %f\n",
&col[0], &col[1], &col[2], &col[3], &col[4], &col[5],
&col[6]) == 7)
{ col += 7; ++n;
}
return n; } // loadifs( ).
//
// Аффинное преобразование координат.
//
void affine( float& x, float& y, float* col )
{ float nx; nx = x*col[ 0 ] + y*col[ 1 ] + col[ 4 ]; y = x*col[ 2 ]
+ y*col[ 3 ] + col[ 5 ]; x = nx;
}
//
// Нахождение неподвижной точки.
//
void root( float* col, float& x, float& y )
{ x = y = 1.0; for( short i = 0; i < 100; ++i )
affine( x, y, col ); }
//
// Линейная интерполяция между двумя IFS.
//
void morph( float* ifs, float* ifs1, float* ifs2, short n, float
phase )
{ for( short j = 0, k = 0; j < n; ++j )
for( short i = 0; i < 7; ++i, ++k ) ifs[ k ] =
(1-phase)*ifs1[ k ] + phase*ifs2[ k ];
} // morph( ).
//
// Итеративная визуализация IFS
// с использованием коэффициентов масштабирования.
//
void render( float* ifs, short n )
{ float x, y;
root( ifs, x, y );
srand( 0 );
for( long i = 0; !_bios_keybrd( 1 ); ++i )
{ float k = rand( ) / (float)RAND_MAX; float* col = ifs; float
p = 0; for( short j = 0; j < n-1; ++j, col += 7 ) {
p += col[ 6 ];
if( k <= p ) break;
}
affine( x, y, col );
_setpixel( (x-min_x)/delta_x*MX, MY-(y-min_y)/delta_y*MY
); }
} // render( ).
//
// Нахождение коэффициентов для масштабирования на экране.
//
void scale( float* ifs, short n )
{ float max_x, max_y;
max_x = -1e10,
min_x = 1e10,
max_y = -1e10,
min_y = 1e10;
float x, y;
root( ifs, x, y );
srand( 0 );
for( long i = 0; i < 10000; ++i )
{ float k = rand( ) / (float)RAND_MAX; float* col = ifs; float
p = 0; for( short j = 0; j < n-1; ++j, col += 7 ) {
p += col[ 6 ];
if( k <= p ) break;
}
affine( x, y, col );
max_x = max( x, max_x );
min_x = min( x, min_x );
max_y = max( y, max_y );
min_y = min( y, min_y ); }
delta_x = max_x - min_x;
delta_y = max_y - min_y;
} // scale( ).
//
// FilePtr, BytePtr, ...
//
// ptr.h
//
// (C) 1995 Artyom Sunduchkov.
//
#ifndef __PTR__
#define __PTR__
#include <stdio.h>
typedef unsigned char byte;
template <class T> class Ptr
{ public:
Ptr( long size ) { data = new T[ size ]; }
Ptr( T* p ) { data = p; }
Ptr( ) { data = NULL; }
void init( long size ) { data = new T[ size ]; }
void done( ) { delete data; data = NULL; }
~Ptr( ) { done( ); }
operator T*( ) { return data; }
private: T* data;
};
typedef Ptr <byte > BytePtr;
typedef Ptr <short> ShortPtr;
typedef Ptr <long > LongPtr;
typedef Ptr <float> FloatPtr;
class FilePtr
{ public:
FilePtr( const char* n, const char* a )
{ ptr = fopen( n, a );
}
FilePtr( FILE* p ) { ptr = p; }
~FilePtr( ) { fclose( ptr ); } operator
FILE*( ) { return ptr; }
private: FILE* ptr;
};
#endif
//
// Фракталы в формате FRACTINT
//
// ifs.ifs
//
// Все IFS приведены к 4 функциям.
//
curl { 0.04 0.22 0.31 -0.03 0.63 -1.74 0.13
-0.02 0.00 -0.32 0.26 -0.17 -1.35 0.01 0.79 0.06 -0.03 0.73 -0.02
1.03 0.74
-0.03 -0.30 0.35 -0.04 -0.68 -0.94 0.12 }
davis { -0.50 -0.30 0.30 -0.50 -6.07 -3.58 0.33 -0.50 -0.29 0.29
-0.50 5.92 3.50 0.33
0.00 -0.59 0.59 0.00 -0.09 -0.04 0.34 .0 .0 .0 .0 .0 .0 .0
}
leaf { 0.14 0.01 0.00 0.51 -0.08 -1.31 0.06 0.43 0.52 -0.45 0.50
1.49 -0.75 0.37 0.45 -0.49 0.47 0.47 -1.62 -0.74 0.36 0.49 0.00 0.00
0.51 0.02 1.62 0.21
}
binary { .5 .0 .0 .5 -2.563477 -0.000003 .333333 .5 .0 .0 .5
2.436544 -0.000003 .333333 .0 -.5 .5 .0 4.873085 7.563492 .333333 .0
.0 .0 .0 .0 .0 .0 }
coral { .307692 -.531469 -.461538 -.293706 5.401953 8.655175 .40
.307692 -.076923 .153846 -.447552 -1.295248 4.152990 .15 .000000
.545455 .692308 -.195804 -4.893637 7.269794 .45 .0 .0 .0 .0 .0 .0
.0 }
crystal { .696970 -.481061 -.393939 -.662879 2.147003 10.310288
.747826 .090909 -.443182 .515152 -.094697 4.286558 2.925762 .252174
.0 .0 .0 .0 .0 .0 .0 .0 .0 .0 .0
.0 .0 .0 }
dragon { .824074 .281482 -.212346 .864198 -1.882290 -0.110607
.787473 .088272 .520988 -.463889 -.377778 0.785360 8.095795 .212527
.0 .0 .0 .0 .0 .0 .0 .0 .0 .0 .0
.0 .0 .0 }
fern { 0 0 0 .16 0 0 .01
.85 .04 -.04 .85 0 1.6 .85
.2 -.26 .23 .22 0 1.6 .07 -.15 .28 .26 .24 0 .44 .07 }
floor { .0 -.5 .5 .0 -1.732366 3.366182 .333333 .5 .0 .0 .5
-0.027891 5.014877 .333333 .0 .5 -.5 .0 1.620804 3.310401 .333333 .0
.0 .0 .0 .0 .0 .0 }
koch { .307692 -.000000 .000000 .294118 4.119164 1.604278 .2 .192308
-.205882 .653846 .088235 -0.688840 5.978916 .3 .192308 .205882
-.653846 .088235 0.668580 5.962514 .3 .307692 -.000000 .000000
.294118 -4.136530 1.604278 .2 }
spiral { .787879 -.424242 .242424 .859848 1.758647 1.408065 .895652
-.121212 .257576 .151515 .053030 -6.721654 1.377236 .052174
.181818 -.136364 .090909 .181818 6.086107 1.568035 .052174 .0 .0
.0 .0 .0 .0 .0
}
swirl5 { .745455 -.459091 .406061 .887121 1.460279 0.691072 .912675
-.424242 -.065152 -.175758 -.218182 3.809567 6.741476 .087325 .0
.0 .0 .0 .0 .0 .0 .0 .0 .0 .0 .0 .0 .0
}
tree { 0 0 0 .5 0 0 .05
.42 -.42 .42 .42 0 .2 .4
.42 .42 -.42 .42 0 .2 .4 .1 0 0 .1 0 .2 .15
}
triangle { .5 0 0 .5 0 0 .33 .5 0 0 .5 0 1 .33 .5 0 0 .5 1 1 .34 .0
0 0 .0 0 0 .00 }
triangle2 { -0.40 0.00 0.00 -0.40 0.24 0.37 0.23
0.50 0.00 0.00 0.50 -1.37 0.25 0.36
0.21 0.00 0.00 0.21 1.00 1.47 0.06
0.50 0.00 0.00 0.50 0.76 -1.16 0.36 }
zigzag2 { -.632407 -.614815 -.545370 .659259 3.840822 1.282321
.888128 -.036111 .444444 .210185 .037037 2.071081 8.330552 .111872
.0 .0 .0 .0 .0 .0 .0
.0 .0 .0 .0 .0 .0 .0
}
Литература
1. Дональд Мичи, Рори Джонсон. Компьютер - творец. - М.: Мир, 1987 (1984 - оригинал).
2. Gavin S. P. Miller. The Definition and Rendering of Terrain Maps // ACM SIGGraph.-1990.- Vol. 20, No. 4.
3. Енс Федер. Фракталы. - М.: Мир, 1991 (1988 - оригинал).
4. Francis S.Hill. Computer Graphics. // Macmillan Publishing Company.- 1990.
5. Foley, van Dam, Feiner, Hughes. Computer Graphics: Principles and Practice. - Addison-Wesley Publishing Company, 1990.
6. Дональд Роджерс. Алгоритмические основы машинной графики. - М.: Мир, 1990.
7.Yuval Fisher. Fractal Image Compression. - IEEE SIGGraph Course Notes, 1992.
Размещено на Allbest.ru
...Подобные документы
Компьютерная графика как инструмент для синтеза (создания) изображений. Характеристика векторного, растрового и фрактального типов представления изображений, трёхмерная графика. Интерфейс программы "Photoshop", пример работы по коррекции фотографий.
курсовая работа [4,5 M], добавлен 19.01.2011Фракталы как структуры, состоящие из частей, которые в каком-то смысле подобны целому, их классификация и разновидности. Алгоритмы фрактального сжатия изображений. Универсальные и векторные графические форматы, их отличительные характеристики и свойства.
презентация [192,7 K], добавлен 12.02.2014Положения алгоритмов сжатия изображений. Классы приложений и изображений, критерии сравнения алгоритмов. Проблемы алгоритмов архивации с потерями. Конвейер операций, используемый в алгоритме JPEG. Характеристика фрактального и рекурсивного алгоритмов.
реферат [242,9 K], добавлен 24.04.2015Назначение, функции и структура электронных таблиц Microsoft Excel. Методика выполнения расчетов с использованием стандартных функций и построения диаграмм. Пример построения таблицы и диаграммы о размере выплат заработной платы сотрудникам предприятия.
контрольная работа [1,5 M], добавлен 24.07.2010Створення алгоритму фрактального стиснення з втратами для зображень. Основні принципи методу, його обґрунтування та алгоритм реалізації. Характеристика типової схеми фрактального стиснення. Побудова алгоритму, його представлення та афінне перетворення.
курсовая работа [932,1 K], добавлен 10.07.2017Рассмотрение алгоритма, основанного на использовании рекурсивной функции. Пример построения простого самоподобного фрактала - ковра Серпинского, снежинки Коха, кривых Пеано и Гильберта. Понятие L-система и терл-графика. Составление программы "Koch.m".
курсовая работа [3,6 M], добавлен 14.12.2012Сущность, основные свойства и классификация фракталов. Построение триадной кривой Коха и "дракона" Хартера-Хейтуэя, треугольник Серпинского и множество Жюлиа. Сущность L-кодирования. Создание программы на языке BorlandPascal для построения фракталов.
курсовая работа [1,2 M], добавлен 13.04.2015Графики вещественнозначных функций вещественного переменного. Построение двумерных графиков. Пример построения графика синусоиды. Пример использования функции subplot. Оформление двумерных графиков в системе MatLab. Основные функции оформления графиков.
курсовая работа [826,3 K], добавлен 30.04.2019Изучение современных методик компьютерной обработки биомедицинских изображений с целью улучшения изображений для их наилучшего визуального восприятия врачом-диагностом и эффективного сжатия изображений – для надежного хранения и быстрой передачи данных.
курсовая работа [2,3 M], добавлен 15.04.2019Понятие фрактала и фрактальной геометрии. Роль фракталов в машинной графике, самоподобие как основное свойство. Области применения фракталов. Учение о сложных нелинейных динамических системах (теория хаоса). Интеграция детерминированных фракталов и хаос.
курсовая работа [1,0 M], добавлен 20.08.2009Способы построения остовного дерева (алгоритма поиска в глубину и поиска в ширину). Вид неориентированного графа. Понятие и алгоритмы нахождения минимальных остовных деревьев. Последовательность построения дерева графов по алгоритмам Крускала и Прима.
презентация [22,8 K], добавлен 16.09.2013Особенности и принципы построения изометрических изображений с использованием средств программы AutoCAD. Режимы объектной привязки, а также способы ее осуществления: разовые и текущие. Команды редактирования чертежа. Вычерчивание объектов в изометрии.
контрольная работа [1,1 M], добавлен 10.10.2016Составление схемы алгоритма и программы для построения графика временной функции, работающей как в машинном, так и в реальном времени. Пример вычисления степенного ряда с помощью схемы Горнера. Описание переменных программы, листинг, процедуры и функции.
курсовая работа [67,6 K], добавлен 20.11.2012Классификация основных фракталов: алгебраические, геометрические и стохастические. Рассмотрение нескольких распространённых видов фракталов: решетка и треугольник Серпинского, крива Коха, фрактал и множество Мандельброта, кривая Дракона и модель Джулии.
курсовая работа [735,1 K], добавлен 11.02.2015Теорема Клини о неподвижной точке - инструмент исследования в теории рекурсивных функций, способ доказательства с помощью языка с дополнительной процедурой "получить текст программы"; классический пример применения теоремы в языке программирования.
курсовая работа [35,6 K], добавлен 06.05.2011Пример создания в Microsoft Excel рабочей книги с именем, группой и фамилией студента. Алгоритм создания таблицы работников фирмы с указанием их должности и зарплаты. Пример построения диаграммы. Работа с сортировкой и поиском данных, автофильтром.
контрольная работа [2,8 M], добавлен 26.12.2010Изучение основных алгоритмов генерации различных видов фракталов. Выбор языка и среды программирования. Характеристика структурных элементов растрового графического редактора фракталов. Описание интерфейса приложения, порядок редактирования изображений.
курсовая работа [1,2 M], добавлен 04.04.2014Алфавит, операторы языка С#. Понятие классов и объектов, модификаторы. Структура программного модуля. Практический пример заполнения матрицы. Программа нахождения первого отрицательного члена заданной последовательности, контрольный пример и блок-схема.
курсовая работа [1,4 M], добавлен 04.01.2015Безопасное состояние информационной системы. Основные утверждения (факты). Алгоритм построения графа распределения ресурсов для стратегии избежания тупиков. Структуры данных для алгоритма банкира, пример его использования. Алгоритм обнаружения тупиков.
презентация [1,3 M], добавлен 24.01.2014Сведения о фракталах, способы их построения. Неизменность геометрических особенностей фрактала при изменении масштаба. Алгоритм построения фрактала и его реализация в программе. Длина береговой линии и понятие фрактала. Салфетка и ковер Серпинского.
курсовая работа [579,4 K], добавлен 12.01.2012