2012-04-04 5 views
1

Как вы можете видеть из заголовка, я занимаюсь программированием небольшой программы для визуализации фракталов на Java. Любой, кто имеет дело с фракталами, достигнет точки, в которой он или она ищет решение, чтобы убрать эти глупые «полосы», когда вы просто окрашиваете пиксель по количеству итераций, которые потребовались, чтобы убежать. Итак, я искал более продвинутый алгоритм раскраски, нахожу «нормализованный счетчик итераций». Формула я использую:Нормализованный счетчик итераций не работает. Что я делаю не так?

float loc = (float) 1 - Math.log(Math.log(c.abs()))/Math.log(2); 

Все в Интернете настолько счастлив об этом алгоритме, каждый использует его, Everbody получает отличные результаты. Кроме меня. Я думал, этот алгоритм должен обеспечивать поплавок между 0 и 1. Но этого не происходит. Я сделал некоторые расчеты и пришел к выводу, что этот алгоритм работает только для c.abs()> = Math.E & & c.abs() < = Math.exp (2) (то есть Math.E * Math. E). В цифрах это означает, что мой ввод в это уравнение должен быть между 2,718 и 7,389.

Но комплексное число c считается склонным к бесконечности, когда его величина становится больше 2. Но для любого ввода, меньшего, чем Math.E, я получаю значение больше единицы. И для любого числа, большего, чем Math.exp (2), он становится отрицательным. Это тот случай, если сложное число ускоряется очень быстро.

Итак, пожалуйста, скажите мне: что я делаю неправильно. Я в отчаянии.

Спасибо.

EDIT:

Я был неправ: код, который я отвечал правильно, я просто 1. использовал это неправильный путь, и поэтому он не обеспечивает правильный вывод. 2. Должен был установить значение спасения алгоритма mandelbrot/julia на 10, иначе у меня снова были бы глупые группы.

Проблема решена!

+0

Вы делаете что-то в java, но вы не отметили java –

+0

Значение для спасения должно быть 2, а не 10. – karatedog

+0

@karatedog. При реализации сглаживания вам нужно увеличить выкуп до значения, значительно превышающего 2 - и фактически, больше 10 (OP, возможно, уже это обнаружил). Полагаю, я должен объяснить, почему в качестве ответа. – sh1

ответ

0

Вы опустили значение итерации, попробуйте следующее:

float loc = <iteration_value> + (float) 1 - Math.log(Math.log(c.abs()))/Math.log(2); 

iteration_value это число итераций, которые дали c в формуле.

1

Как вы уже выяснили, вам необходимо увеличить радиус спасения до того, как сглаживание будет выглядеть правильно.

Два - это минимальная длина, которую может иметь координата, например, когда вы ее квадратизируете и добавляете начальное значение, это не может привести к меньшей длине. Если предыдущая длина равнялась 2,0, и вы ее квадратизировали, вы имели бы длину 4.0 (указывали бы в любом направлении), и самое большее, что любое значение c могло бы уменьшить это на 2.0 (путем указания в противоположном направлении) , Если бы с было больше, чем тогда, то оно сразу же исчезло бы.

Теперь, чтобы оценить дробную часть числа итераций, мы посмотрим на окончательный | z |. Если z было просто квадратизировано, а c не добавлено к нему, то оно будет иметь длину от 2,0 до 4,0 (новое значение должно быть больше 2,0 для спасения, а старое значение должно было быть меньше 2,0, чтобы не задерживаться ранее).

Без c, взятие | z | пропорционального положения между 2 и 4 дает нам дробную часть числа итераций.Если | z | близко к 4, то предыдущая длина должна была быть близка к 2, поэтому она была уже близка к спасению предыдущей итерации, и сглаженный результат должен быть близок к предыдущему счету итерации, чтобы представить это. Если он близок к 2, предыдущая итерация была продолжена, и результат сглаживания должен быть ближе к новому количеству итераций.

К сожалению, c messes that up. Чем больше c, тем больше потенциальная ошибка в этой простой связи. Даже если старая длина почти равнялась 2,0, она, возможно, приземлилась так, чтобы влияние c показало, что она, должно быть, меньше.

Увеличение эффективности спасения уменьшает эффект добавления c. Если выдается 64, тогда результирующая длина будет между 64 и 4096, а максимальное смещение c 2 имеет пропорционально меньшее влияние на результат.