Алгоритм Мандельброта - Цвет фона

Я пишу приложение Мандельброта на C # (и тестирую на Python). У меня уже есть сплошная раскраска от набора до его границ. Моя текущая проблема - установить цвет фона окружения. Мой текущий код для получения цвета теперь выглядит так: он получает цвет как двойной (функция логарифмирования выполняется раньше) и проверяет, является ли он частью или нет, и создает довольно плавный градиент (от черного к оранжевому).

    private Color getColor(double i)
    {
        double ratio = i / (double)(iterations);
        int col = (int)(i / iterations * 255);
        int alpha = 255;

        if (ratio >= 0 && ratio < 0.25)
            return Color.FromArgb(alpha, col, col/5, 0);

        if (ratio >= 0.25 && ratio < 0.50)
            return Color.FromArgb(alpha, col, col/4, 0);

        if (ratio >= 0.50 && ratio < 0.75)
            return Color.FromArgb(alpha, col, col/3, 0);

        if (ratio >= 0.75 && ratio < 1)
            return Color.FromArgb(alpha, col, col/2, 0);

        return Color.Black; //color of the set itself
    }

Как я могу изменить черную среду (не набор Мандельброта) на другой цвет, например обфусцированный скрипт Python (http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python) делает? Я уже отредактировал сценарий в более красивой форме, но он не соответствует моему алгоритму.

РЕДАКТИРОВАТЬ: Забыл упомянуть, я не использую класс для сложного уравнения, я вычисляю фрактал с алгоритмом, который показан в Википедии.


person michaeln    schedule 27.04.2013    source источник
comment
Итак, что вы хотите знать, это как интерполировать между двумя цветами RGB (в данном случае черным и оранжевым)?   -  person martineau    schedule 27.04.2013
comment
Нет, как я уже писал, я уже использовал двойной логарифм раньше, поэтому у меня получается довольно плавный градиент (в моем случае от черного к оранжевому). Моя проблема в том, чтобы изменить цвет фона всего фрактального изображения, как в опубликованной мной ссылке. Или я вас неправильно понимаю?   -  person michaeln    schedule 28.04.2013
comment
двойной логарифм: log (log (sqrt (x ^ 2 + y ^ 2))) / log (2) Да, ваша догадка с итерациями верна, это максимальное количество. Как бы вы интерполировали набор цветов?   -  person michaeln    schedule 28.04.2013
comment
Я не понимаю, какое отношение имеет формула двойного логарифма к сглаживающим градиентам, к коду в вашем ответе или к вашему вопросу. Обфусцированный код, на который вы ссылались, тоже не очень помог. В любом случае, вы имеете в виду, что хотели бы иметь цвет фона, такой как самый внешний голубоватый градиент, показанный на первом изображении в ссылке?   -  person martineau    schedule 28.04.2013
comment
Мои ответы на вопрос Python - Range values ​​to pseudocolor дает общее представление о интерполяции через разные цветовые пространства.   -  person martineau    schedule 28.04.2013
comment
Двойной логарифм сглаживает края менее удачных областей, и я включил код, который использую для раскрашивания фрактала. Ссылка была предназначена только для того, чтобы получить представление о том, что я пытался сделать. Я реализовал вашу интерполяцию, но она создает только плавный градиент (более плавный, чем мой, из-за HSV). Спасибо за это. Но знаете ли вы, как получить размытый фон, как в опубликованной мной ссылке? Что-то вроде размытия фрактала и добавления его за резким.   -  person michaeln    schedule 28.04.2013
comment
Я не понимаю, как ваша формула двойного логарифма соотносится со значением iterations в вашем коде. Как видите, для этого черно-белый постеризованный версии изображения в опубликованной вами ссылке, есть много мелких вариаций значений цвета вне набора Julia, которые используются для того, чтобы фрактал выглядел размытым. Я могу расширить свои ответы о псевдоцвете и показать, как заставить их интерполировать между всей палитрой (списком) разных цветов rgb вместо двух, если вы думаете, что это будет полезно.   -  person martineau    schedule 29.04.2013
comment
Если бы вы могли это сделать, я был бы очень благодарен. (Думаю, вы сами сделали это постеризованное изображение, не могли бы вы поделиться своими знаниями?)   -  person michaeln    schedule 04.05.2013
comment
Хорошо, я поработаю над псевдоцветом по списку разных цветов в эти выходные, если позволит время, и опубликую что-нибудь. Я делал это раньше, но не на Python. Мне пришло в голову, что, возможно, вы пытаетесь изобразить эту формулу двойного логарифма вместо набора Жюлиа или какого-либо другого фрактала (я все еще хочу знать, как ваша формула двойного логарифма соотносится с тем, что вы пытаетесь сделать).   -  person martineau    schedule 04.05.2013
comment
Вы очень любезны. Моя основная цель - визуализировать фрактал Мандельброта в увеличенном масштабе. Эта формула двойного логарифма позволяет сгладить цвет между точками (вероятно, эта точка находится в наборе или нет - ›цвет), так что вы получите что-то вроде градиента.   -  person michaeln    schedule 04.05.2013


Ответы (1)


Вот быстрая и грязная адаптация моего ответа на другой вопрос о сопоставлении диапазона значений псевдоцветам, что позволяет им быть отображается на всю палитру цветов RGB вместо двух. Обратите внимание, что промежуточные цвета интерполируются в цветовом пространстве RGB, а не в HSV (что, на мой взгляд, выглядит лучше, но требует дополнительных вычислений).

Я не совсем доволен этим, но мое время очень ограничено в эти выходные, и, по крайней мере, то, что у меня есть, похоже, работает, даже если оно неоптимально, поэтому я отправлю его, чтобы вы поигрались с ним:

def palette_pseudocolor(val, minval, maxval, palette):
    max_index = len(palette)-1
    # convert val in range minval...maxval to range 0..max_index
    v = (float(val-minval) / (maxval-minval)) * max_index
    # split result into integer and fractional parts
    i = int(v); f = v-i
    # interpolate between two colors in the palette
    c0, c1 = palette[i], palette[min(i+1, max_index)]
    d = c1[0]-c0[0], c1[1]-c0[1], c1[2]-c0[2]
    return c0[0]+f*d[0], c0[1]+f*d[1], c0[2]+f*d[2]

if __name__ == '__main__':
    numsteps = 10
    palette = [(1,0,0), (0,1,0), (0,0,1)] # [RED, GREEN, BLUE]
    print 'val       R      G      B'
    for val in xrange(0, 100+numsteps, numsteps):
        print ('%3d -> (%.3f, %.3f, %.3f)' %
               ((val,) + palette_pseudocolor(val, 0, 100, palette)))

Вывод:

val       R      G      B
  0 -> (1.000, 0.000, 0.000)
 10 -> (0.800, 0.200, 0.000)
 20 -> (0.600, 0.400, 0.000)
 30 -> (0.400, 0.600, 0.000)
 40 -> (0.200, 0.800, 0.000)
 50 -> (0.000, 1.000, 0.000)
 60 -> (0.000, 0.800, 0.200)
 70 -> (0.000, 0.600, 0.400)
 80 -> (0.000, 0.400, 0.600)
 90 -> (0.000, 0.200, 0.800)
100 -> (0.000, 0.000, 1.000)

Вот цветовой градиент, созданный с помощью красной, зеленой и синей палитры в примере:

цветовой градиент из красной, зеленой и синей палитры

person martineau    schedule 05.05.2013