2010-09-22 4 views
3

Я пытаюсь представить Mandelbrot с 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++; 

в «другое» ветвп до вычисления цвета, картина выходит абсолютно, изящно гладкой.

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

+0

Просто из любопытства. Что это за язык? Интересно, так как у него есть функция abs(), которая обрабатывает комплексные числа. –

+0

Это Visual C++. Код был написан с использованием класса Visual C++ . Проверьте это здесь: http://msdn.microsoft.com/en-us/library/0352zzhd.aspx – fyodorananiev

ответ

3

Я на самом деле не уверен, но я предполагаю, это что-то делать с тем, что журнал логарифм числа (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.14.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 

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

Я на самом деле не сделал достаточно математики, чтобы быть уверенным, что это на самом деле твердое объяснение, но это было бы моим догадком.

+0

Ничего себе, это похоже на полное исследование ... Отличное объяснение. – fyodorananiev

+0

Спасибо, @furikuretsu – lindes

+1

Я должен указать, что я на самом деле не уверен, что это то, что он делает. Проверяя некоторые другие числа, часть, которую я сказал о стабилизации из продолженных итераций, точна, но разница между, скажем, значениями 1-побега одной точки и значениями 1-го выхода другой соседней точки, по-видимому, не была больше разницы между, скажем, 5-итерационными значениями прошлых побегов. Но, может быть, я просто использовал очки, которые, как оказалось, оценивали очень похоже? Мне нужно было исследовать его гораздо глубже, чтобы быть уверенным. – lindes

2

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

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

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

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

3

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

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

Поскольку функция it self определяется как 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 | почти на самом деле на первой ускользающей итерации вы будете БОЛЬШОЙ от Предела. Если, с другой стороны, вы решили сделать это после | Z |> 100 для ускорения привязки, например, или просто предпримите еще несколько итераций, вы станете более стабильными.

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

Смежные вопросы