mandelbrot集的平滑着色算法

时间:2015-03-25 23:40:35

标签: algorithm colors tkinter fractals mandelbrot

我知道alr​​ady对此有很多疑问。但是,我的情况略有不同。每当我们按照我的理解实现平滑着色算法时。

mu = 1 + n + math.log2(math.log2(z))  / math.log2(2)

其中n是转义迭代,2是幂z是,如果我没有误,z是该转义迭代处的复数的模数。然后,我们在颜色之间的线性插值中使用此重新规范化的转义值,以生成平滑的带状mandelbrot集。我已经看到了关于这个问题的答案,我们通过HSB到RGB转换来运行这个值,但是我仍然无法理解这将如何提供平滑的颜色渐变以及如何在python中实现它。

但是,每当我尝试实现它时,它会产生浮点RGB值,但除了.tiff文件之外,我不知道的图像格式会支持这一点,如果我们四舍五入到整数我们仍然有不平滑的条带。那么,如果我们不能直接使用它产生的RGB值,这应该如何产生平滑的带状图像?我在下面尝试的示例代码,因为我没有完全如何实现这一点,我尝试了一种有点产生平滑条带的解决方案。这样就可以在两种颜色之间产生一个稍微平滑的带状图像,蓝色表示全套颜色,逐渐变白的颜色,我们进一步放大设置到某一深度,一切都显得模糊的点。由于我使用tkinter来执行此操作,因此我必须将RGB值转换为十六进制,以便能够将它们绘制到画布上。

我;我递归地计算集合,在我的其他函数中(未在下面发布)我设置窗口的宽度和高度,然后在tkinter窗口的像素上迭代这些并在内部循环中计算这种递归。 / p>

def linear_interp(self, color_1, color_2, i):

    r = (color_1[0] * (1 - i)) + (color_2[0] * i)
    g = (color_1[1] * (1 - i)) + (color_2[1] * i)
    b = (color_1[2] * (1 - i)) + (color_2[2] * i)
    rgb_list = [r, g, b]
    for value in rgb_list:
        if value > MAX_COLOR:
            rgb_list[rgb_list.index(value)] = MAX_COLOR
        if value < 0:
            rgb_list[rgb_list.index(value)] = abs(value)

    return (int(rgb_list[0]), int(rgb_list[1]), 
            int(rgb_list[2]))

def rgb_to_hex(self, color):
    return "#%02x%02x%02x" % color

def mandel(self, x, y, z, iteration):
    bmin = 100
    bmax = 255
    power_z = 2

    mod_z = math.sqrt((z.real * z.real) + (z.imag * z.imag))
    #If its not in the set or we have reached the maximum depth
    if  abs(z) >= float(power_z) or iteration == DEPTH:
        z = z
        if iteration > 255:
            factor = (iteration / DEPTH) * 255
        else:
            factor = iteration

        logs = math.log2(math.log2(abs(z) + 1 ) / math.log2(power_z))
        r = g = math.floor(factor + 5 - logs)

        b = bmin + (bmax - bmin) * r / 255
        rgb = (abs(r), abs(g), abs(round(b)))
        self.canvas.create_line(x, y, x + 1, y + 1,
                                fill = self.rgb_to_hex(rgb))

    else:

        z = (z * z) + self.c
        self.mandel(x, y, z, iteration + 1)

    return z

1 个答案:

答案 0 :(得分:0)

颜色#000000,#010000,...,#FE0000,#FF0000之间的差异非常小,您可以获得从黑色到红色的平滑渐变。因此,简单地围绕您的值:假设平滑度函数的平滑颜色值范围从0到(不包括)1,那么您只需使用     (int)(值* 256)