algorithm - Mandelbrot 集的平滑着色算法

标签 algorithm colors tkinter fractals mandelbrot

我知道已经回答了很多关于此的问题。然而,我的略有不同。每当我们实现我所理解的平滑着色算法时。

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

其中 n 是逃逸迭代,2 是 z 的幂,如果我没记错的话,z 是该逃逸迭代中复数的模数。然后,我们在颜色之间的线性插值中使用这个重新归一化的转义值来生成平滑带状的 mandelbrot 集。我已经看到其他问题的答案,我们通过 HSB 到 RGB 转换运行这个值,但是我仍然不明白这将如何提供平滑的颜色渐变以及如何在 python 中实现它。

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

我正在递归计算集合,在我的另一个函数(未在下面发布)中,我正在设置窗口宽度和高度,然后针对 tkinter 窗口的像素对这些进行迭代,并在内部循环中计算此递归。

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

最佳答案

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

关于algorithm - Mandelbrot 集的平滑着色算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29268585/

相关文章:

java - 创建线程来运行算法播放器

algorithm - 图灵机元素唯一性问题

java - Android Java - 下拉微调器始终设置相同的文本,只想更改背景颜色

javascript - 每当用户添加 <li> 时,jquery 从数组中选择特定颜色

python - 将 Matplotlib 与 tkinter (TkAgg) 结合使用

python - Python 中的自适应 ODE 算法

java - 基于刻度值的颜色java JSlider

python - 在 Tkinter 标签中嵌入 Matplotlib 图

python - .png 是 python 的 tkinter 模块唯一可接受的格式吗?

java - 寻找有关 trie 的良好介绍