Фрактальные картинки

elena144

Объясните мне, пожалуйста, как построить фрактальное пламя.
Читал ссылку и вот эту статью, но всё равно не могу некоторые моменты догнать.
Я попытался, начать с простого — одной линейной вариации. Сразу возникла куча непоняток.
Вот мой некий псевдокод для отрисовки:

function variation_linear(x, y)
{
// проводим некие преобразования координат с взятыми от балды коэффициентами
return 0.8*x + 0.2*y + 10, 0.3*x + 0.5*y + 12;
}

pixels = array[100][100];
// инициализируем начальную точку и её цвет
x = rand(0, 99);
y = rand(0, 99);
pixels[x][y] = rand(0xFFFFFF); // Каналы, понятно, надо на самом деле обрабатывать по отдельности, но пока проблема не в этом

// Здесь мы должны по идее запустить набор итераций
for (i = 0; i < 10000; i++)
{
x, y = variation_linear(x, y); // Проводим вариацию, она всего одна
if(i > 20) // До двадцатой итерации в доке почему-то пишут не рисовать точку
pixels[x][y] = (pixels[x][y] + 0x050000) / 2; // смешиваем цвет пикселя с цветом функции
}

// ... выводим массив пикселей в пнг-шку

Непонятные моменты:
1. Как определить необходимое количество итераций? Экспериментально?
2. Как подбирать коэффициенты для преобразований координат?
3. Пробовал вместо линейной вариации взять handkerchief:

function handkerchief(x, y)
{
r = sqrt(x^2 + y^2);
teta = (y == 0 ? Pi/2 : atan(x/y;
return r*sin(teta + r r*cos(teta - r);
}

В результате уже ко второй-третьей итерации, если не вводить никаких преобразований координат, мои координаты скатываются в ноль и оттуда не уходят (потому что r==0). Очевидно, преобразования координат необходимо делать всегда? Тогда я возвращаюсь к вопросу 2.
4. Что делать с координатами? Понятное дело, функции абсолютно насрать на мои целочисленные координаты и размер картинки 100х100. Поэтому текущий алгоритм с двумерным массивом пикселей даёт херню и ошибки. Как это принято делать? Создавать просто изначально список сгенерённых точек с абсолютным координатами, а потом отображать (-2^32, 2^32-1) в (0, 100)? Или это как-то более по-людски делают?
5. Подозреваю, что я ещё что-нибудь важное и обязательное мог упустить в вычислении координат.
Я просто ни математики не знаю, ни с компьютерной графикой по сути почти никогда не работал.

Elena12345

> 1. Как определить необходимое количество итераций? Экспериментально?
Да, это трейд-офф между красивостью и скоростью.
> 2. Как подбирать коэффициенты для преобразований координат?
Экспериментально, конечно. Что-то прикольнее выглядит, что-то не очень.
> 4. Что делать с координатами?
Хранить и обрабатывать в плавающей точке. Потом какой-нибудь регион, скажем, [-1.0 .. 1.0]x[-1.0 .. 1.0] отображать в окно или картинку нужного размера. Фух, какой бред. Нужно при сохранении в массив округлять, но пара x, y должна быть во floating-point и не страдать от регулярных округлений.

elena144

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

Elena12345

Для простых вариаций может и можно (но я сходу не могу ничего предложить но для сложных всё равно потребуется оценивание человеком.

toxin

Функций должно быть минимум 2 - иначе ничего не получится.
2. В статье написано что-то странное. Лучше накапливать сумму и частоту и выводить среднее.
Т.е.
result_b[x][y] += pixels[x][y]&0xff;
result_g[x][y] += (pixels[x][y]&0xff00)>>8;
result_r[x][y] += (pixels[x][y]&0xff0000)>>16;
result_count[x][y]++;
а потом делить result_b, result_g, result_r на result_count и вычислять итоговый цвет.
(result_xxx должны быть int/long).

elena144

Я воспользовался немножко другой формулой — для каждого канала X при добавлении точки делаю так:
if (x) point.x = int(point.x/2 + x);

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

toxin

Если функций 2 или больше, то ничего подбирать не надо. А если одна - то как не подбирай, ничего не получится.
Оставить комментарий
Имя или ник:
Комментарий: