на главную страницу


Фракталы

 Мартынов Сергей Александрович
Группа: 208: Задание 1


Download and
Install by
Self-Extracting

It's free,
It's easy.

Реализован метод, позволяющий построить следующие фракталы:
  • множество Мандельброта;
  • множество Жюлиа;
  • фрактал Ньютона (для F(z)=z^p);
  • различные вариации и комбинации этих фракталов.

Из дополнительных возможностей реализовано:

  •  возможность сохранения в файл;
  • возможность масштабирования изображения;
  • возможность просчета картинки произвольных размеров;
  • возможность просчета и просмотра анимации;
  • возможность сохранения и загрузки параметров фрактала;
  • алгоритм сглаживания резких переходов цвета в изображении фрактала/

Система программирования: Borland C++ Builder 3.0
ОС:
Windows 95. Аппаратура: AMD-K6-166 / 32Mb RAM

Метод:

Последовательность комплексных чисел вычисляется по рекуррентной формуле:
z(n+1) = k1*zn^p1 + k2*zn^p2 + k0*z0^p0 + c,

где:

z(n+1) - вычисляемый член последовательности
zn - предыдущий член
k1, k2, k0 - вещественные числа
p1, p2, p0 - целые числа
c - комплексное число
z0 - первый член последовательности

Область изображения - произвольный прямоугольник на комплексной плоскости, который задается координатами его центра, размерами и углом поворота относительно центра - всего 5 вещественных чисел.

Для каждой точки изображения просчитывается не более Iterations (целый параметр) членов последовательности. Последовательность считается расходящейся, если модуль очередного члена превысил Limitation (вещественный параметр), и считается сходящейся, если модуль разности соседних членов стал меньше вещественного параметра Tolerance.

В зависимости от номера члена, на котором выяснилась сходимость последовательности, выбирается цвет точки. Раскраска задается пользователем на специально разработанном органе управления GradientBar.

Интерфейс программы:

Программа использует стандартный интерфейс windows. При запуске программы по умолчанию включен режим вывода подсказок (hints). Текущие настройки, относящиеся к виду фрактального изображения (то есть коэффициенты формулы, область изображения и параметры раскраски) могут быть сохранены в конфигурационном файле (FractGen.ini - он ищется в текущем каталоге). Выбор сохраненного набора параметров из списка и его загрузка осуществляется двойным щелчком мыши.

В каталоге с программой находится конфигурационный файл с 20 предустановками параметров, соответствующих различным фрактальным картинкам. Многие из них лучше смотрятся в большом разрешении - советую просчитать их в размере, скажем, 700x600 (кнопка "Render...").

Если программа не может найти конфигурационный файл (или он поврежден),
то в текущем каталоге создается файл FractGen.ini, содержащий один набор параметров.

NB: Этого не должно произойти, так как в файле FractGen.ini заключается немалая часть работы над заданием!

Анимация сохраняется как последовательность файлов с именами baseXXXX.bmp в заданном каталоге, где base - строка, заданная пользователем, XXXX - шестнадцатеричный номер кадра.

На GradientBar можно левой кнопкой мыши двигать существующие и добавлять новые точки, правой кнопкой - изменять цвет существующих точек. При работе программы (при вычислениях) в строке состояния выводится количество выполненной работы в процентах и предполагаемое время завершения работы.

Заметки по реализации:

Возведение в степень реализовано не через функцию pow (которая работает весьма медленно), а путем многократного умножения - этот метод дает ощутимый прирост производительности, так как обычно используются небольшие значения степени.

Для раскраски применяется придуманный мной алгоритм, вот его краткое описание: на отрезке [0; 1] пользователь в нескольких точках задает цвет.

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

При рисовании фрактала, если вычисления последовательности в данной точке прервалось на i-ой итерации, то точка закрашивается цветом, соответствующим точке i/maxIt на отрезке цветов [0; 1].

Замечу, что этот метод можно применять не только на отрезке, но и в пространстве любой размерности. Оптимальная формула для вычисления следующая:

color(r) = sum(i=1..N, k(i)*color(i)) / sum(i=1..N, k(i)),
k(i) = 1 / (r - r(i))^2;

где:
r - точка, в которой вычисляется цвет
N - число точек, в которых задан цвет color(i) и r(i) - цвет и координата i-ой заданной точки

Можно заметить, что при таком выборе коэффициентов производная "цвета" обращается в 0 в точках задания цвета. Еще одним дополнением является алгоритм сглаживания (переключатель Smooth) резких границ изображения, которые возникают из-за дискретности счетчика итераций. Для сглаживания границ оценивается, насколько модуль очередного члена последовательности "убежал" за установленное предельное значение, и вводится "поправка" (от 0 до 1) к счетчику итераций.

Параметры компиляции:

Программа откомпилирована Borland C++ Builder 3.0 без runtime libraries, то есть для запуска (по идее необходимы всего два файла: FractGen.exe и FractGen.ini.

При компиляции было разрешено использование инструкций процессора Pentium.




WBR, Сергей Мартынов, smarts@beep.ru