Фрактальное пламя — алгоритм построения
Фрактальное пламя (или фрактальные искры, англ. fractal flame) — алгоритм, предложенный Скоттом Дрейвсом (Scott Draves) и использующий для построения изображений системы итерируемых функций (СИФ). Благодаря разным значениям seed для генератора псевдослучайных чисел можно получить множество разнообразных «картин». Хотя фрактальность в них просматривается далеко не всегда, результаты получаются очень интересными.
Под катом — краткое описание основных моментов реализации алгоритма.Для начала, как и в обычных СИФ, нам понадобится узнать коэффициенты для каждого аффинного преобразования плоскости (их может быть несколько; каждое следующее будет вносить свои «мазки» на картину, а также изменять вклад предыдущих). В матричной форме это преобразование выглядит следующим образом:
Необходимо подобрать такие коэффициенты, чтобы полученное преобразование было сжимающим, то есть таким, что его коэффициент масштабирования меньше единицы. Этих преобразований должно быть несколько, и если выбирать случайным образом одно из них, чтобы вычислить новые координаты точки и отобразить ее на экране, мы получим аттрактор — множество точек, из которых и будет состоять изображение.
Используя датчик псевдослучайных чисел, получить такие коэффициенты несложно. При этом надо проверить 3 условия:
Все это относится к коэффициентам, задающим линейное преобразование. Оставшиеся два, и , выполняют трансляцию — перемещение точки на некоторое расстояние. Желательно, чтобы , , и находились на отрезке или . Для и это необязательно, однако не стоит задавать слишком большой отрезок, иначе изображение получится разреженным.
Кроме того, вместе с каждым набором коэффициентов, нужно сохранить стартовые значения трех цветовых составляющих модели RGB, которые будут присваиваться пикселю, в который попали первый раз. Это также делается с помощью датчика случайных чисел и особых трудностей не представляет.
Теперь необходимо определиться, изображение какого разрешения хотим получить и подготовить массив пикселей, каждый элемент которого будет хранить:
координаты x и y;
значения R, G и B;
число попаданий.
Далее приведены некоторые нелинейные преобразования, которые будут выполняться над значениями x и y, полученными после выполнения одного из аффинных преобразований: Синусоидальное: , ;
Сферическое: , ;
Полярное: , ;
Сердце: , ;
Диск: , ;
В конце статьи — примеры изображений, полученных с использованием этих и некоторых других преобразований, а далее — псевдокод процедуры рендеринга:
void render (int n, int eqCount, int it, int xRes, int yRes)
{
Генерируем eqCount аффинных преобразований со стартовыми цветами;
for (int num=0; num
Ну, а теперь обещанные изображения с различными нелинейными преобразованиями Синусоидальное
Сферическое
Полярное
Сердце
Диск
«Ракушка»
Гиперболическое
Водоворот
Волны
А что если применять не одно и то же нелинейное преобразование, а случайным образом выбирать из нескольких?
Исходный код Реализация алгоритма от Джеймса Маккарти на языке Си находится здесь, а статья Скотта Дрейвса на основе которой и создавался алгоритм — здесь.