Непрерывная окраска фрактала - PullRequest
3 голосов
/ 22 сентября 2010

Я пытаюсь визуализировать набор Мандельброта с OpenGL и обнаружил очень странное поведение, когда дело доходит до гладкой раскраски.

Предположим, что для текущего комплексного значения C алгоритм сбежал после n итераций, когда было доказано, что Z больше 2.

Я запрограммировал раскраску так:

if(n==maxIterations){
   color=0.0; //0.0 is black in OpenGL when put to each channel of RGB 
              //Points in M-brot set are colored black.
} else {
   color = (n + 1 - log(log(abs(Z)))/log(2.0) )/maxIterations; 
   //continuous coloring algorithm, color is between 0.0 and 1.0
   //Points outside M-brot set are colored depending of their absolute value,
   //from brightest near the edge of set to darkest far away from set.
}
glColor3f(color ,color ,color );
//OpenGL-command for making RGB-color from three channel values. 

Проблема в том, что это не очень хорошо работает. Некоторое сглаживание заметно, но не идеально.

Но когда я добавляю две дополнительные итерации (только что нашел это где-то без объяснения)

Z=Z*Z+C; 
n++; 

в ветви "else" перед вычислением цвета картинка получается абсолютно гладкой.

Почему это происходит? Зачем нам нужно помещать дополнительные итерации в окрашивающую часть после проверки точки в наборе?

Ответы [ 3 ]

3 голосов
/ 16 ноября 2010

Я не совсем уверен, но я догадываюсь , это как-то связано с тем, что журнал регистрации номера (log(log(n))) является чем-то нестабильным для «маленькие» числа n, где «маленький» в данном случае означает что-то близкое к 2. Если ваш Z только что сбежал, он близок к 2. Если вы продолжите итерацию, вы получите (быстро) все дальше и дальше от 2, и log(log(abs(Z))) стабилизируется, что дает вам более предсказуемое значение ... которое затем дает более плавные значения.

Пример данных, выбранных произвольно:

 n            Z.real            Z.imag         |Z|  status color
-- ----------------- ----------------- ----------- ------- -----
 0             -0.74              -0.2    0.766551 bounded [nonsensical]
 1           -0.2324             0.096    0.251447 bounded [nonsensical]
 2       -0.69520624        -0.2446208    0.736988 bounded [nonsensical]
 3    -0.31652761966     0.14012381319    0.346157 bounded [nonsensical]
 4    -0.65944494902    -0.28870611409    0.719874 bounded [nonsensical]
 5    -0.38848357953     0.18077157738    0.428483 bounded [nonsensical]
 6    -0.62175887162    -0.34045357891    0.708867 bounded [nonsensical]
 7    -0.46932454495     0.22336006613    0.519765 bounded [nonsensical]
 8    -0.56962419064    -0.40965672279    0.701634 bounded [nonsensical]
 9    -0.58334691196     0.26670075833    0.641423 bounded [nonsensical]
10     -0.4708356748    -0.51115812757     0.69496 bounded [nonsensical]
11    -0.77959639873     0.28134296385    0.828809 bounded [nonsensical]
12     -0.2113833184    -0.63866792284     0.67274 bounded [nonsensical]
13     -1.1032138084    0.070007489775     1.10543 bounded 0.173185134517425
14     0.47217965836    -0.35446645882    0.590424 bounded [nonsensical]
15    -0.64269284066    -0.53474370285    0.836065 bounded [nonsensical]
16     -0.6128967403     0.48735189882    0.783042 bounded [nonsensical]
17    -0.60186945901    -0.79739278033    0.999041 bounded [nonsensical]
18     -1.0135884004     0.75985272263     1.26678 bounded 0.210802091344997
19    -0.29001471459     -1.7403558114     1.76435 bounded 0.208165835763602
20     -3.6847298156     0.80945758785     3.77259 ESCAPED 0.205910029166315
21      12.182012228     -6.1652650168     13.6533 ESCAPED 0.206137522227716
22      109.65092918     -150.41066764     186.136 ESCAPED 0.20614160700086
23     -10600.782669     -32985.538932     34647.1 ESCAPED 0.20614159039676
24     -975669186.18       699345058.7 1.20042e+09 ESCAPED 0.206141590396481
25  4.6284684972e+17 -1.3646588486e+18 1.44101e+18 ESCAPED 0.206141590396481
26 -1.6480665667e+36  -1.263256098e+36 2.07652e+36 ESCAPED 0.206141590396481

Обратите внимание, насколько сильно значение цвета все еще колеблется при n в [20,22], становится стабильным при n = 23 и согласуется с n = 24 и далее. И обратите внимание, что значения Z находятся WAY вне круга радиуса 2, который ограничивает множество Мандельброта.

На самом деле я не достаточно разбирался в математике, чтобы быть уверенным, что это действительно убедительное объяснение, но это было бы моим предположением.

3 голосов
/ 28 марта 2011

КАК Я только что сделал ту же программу, и как хороший математик я объясню почему, надеюсь, это будет понятно.

Если, скажем, последовательность с начальным числом C сбежала после k итераций.

Поскольку сама функция определяется как Limit, так как итерации переходят в бесконечность, это не так хорошо, чтобы получить что-то близкое к k. Вот почему.

Поскольку мы знаем, что после 2 последовательность уходит в бесконечность, давайте рассмотрим некоторую итерацию T, где z стало достаточно большим. Считается, что C будет незначительно мал, поскольку обычно вы смотрите набор в [-2,2] и [-1,5,1.5] для оси 2. Таким образом, на итерации T + 1 z будет ~~ z ^ 2 от предыдущего и легко проверить, что в этом случае | z | из T + 1 будет ~~ | z | ^ 2 предыдущего.

Наша функция - log (| z |) / 2 ^ k для K-й итерации. В случае, если мы смотрим на легко увидеть, что на итерации T + 1 это будет ~~ http://www.equationsheet.com/latexrender/pictures/e8ab9446e81684037708209bf8f3a297.gif которая является функцией на итерации T.

Другими словами, как | z | становится «значительно» больше, чем начальное число C. Функция становится все более и более стабильной. Вы НЕ хотите использовать итерацию, близкую к экранированию итерации k, так как на самом деле Z будет близко к 2, и, в зависимости от C, она может быть незначительно мала по сравнению с ней, и поэтому вы не будете близки к пределу.

As | C | на самом деле около 2 на первой итерации, вы будете ОЧЕНЬ ДАЛЕЕ от Предела. С другой стороны, если вы решите сделать это после | Z |> 100 для выхода за границу, например, или просто сделаете еще несколько итераций, вы получите более стабильный результат.

Надеюсь, что все, кто интересуется этим вопросом, ответят на него хорошо.

2 голосов
/ 24 сентября 2010

Пока что кажется, что идея "дополнительных итераций" не имеет для нее убедительных формул, если не считать того факта, что она просто работает.

В одной старой версии статьи Мандельброта из Википедии есть строки о непрерывной окраске:

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

Лучше, чем ничего.

...