当前位置: 首页 > 知识库问答 >
问题:

mandelbrot集的光滑着色算法

万俟皓
2023-03-14

我知道关于这件事,阿雷迪回答了很多问题。然而,我的略有不同。无论何时我们实现平滑着色算法,我都理解它。

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窗口的像素进行迭代,并在内部循环中计算这个递归。

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个答案

史谦
2023-03-14

颜色之间的差异#000000,#010000#FE0000,#FF0000非常小,可以获得从黑色到红色的平滑渐变。因此,只需对值进行四舍五入:假设平滑度函数的平滑颜色值范围为0到(excl)1,则只需使用(int)(值*256)

 类似资料:
  • 我用python编程了Mandelbrot集,但看起来很奇怪,所以我搜索平滑的颜色。我用对数和线性插值编程了一个平滑的着色函数,但是无论我尝试什么,我都得不到我想要的: 这是我的调色板 这里是我的着色功能 这是我得到的 正如你所看到的那样,平滑的颜色是没有连续性的 我想要这样的东西: 理想结果 我们看不到色差

  • 我制作了一个程序来计算mandelbrot集合中的点。对于不属于mandelbrot集的点,我会记录起点发散到震级大于2的地方所需的迭代次数。基本上,对于mandelbrot集合之外的每一点,我都有一个计数器,可以显示它在1到256的范围内发散的速度。我想做的是根据每个点发散的速度给它一个颜色。例如,在255次迭代中发散的点可能是白色的,发散越快,着色越多。我已经做了一个简单的调整,在20步以上的

  • 我正在渲染一个mandelbrot集,并且已经实现了一些平滑的着色,但是当仔细观察时,图片变得非常嘈杂。我想知道,为了达到更好的美感,改善我的色彩的最好方法是什么。使用直方图着色是否有助于去除粗糙的像素区域?这里是一个使用10000次迭代的分形渲染。 这是我现在生成和分配颜色的方式:

  • 为了获得python方面的培训,我决定使用脚本绘制mandelbrot集。绘制它并不太复杂,所以我决定使用颜色,我发现了平滑着色算法。使用这个问题,我能够渲染出一些非常漂亮的东西,类似于这个。 为了实现这一点,我使用三个“步骤”设置了渐变调色板:从深蓝色到浅蓝色,然后从浅蓝色到黄色,最后从黄色到深棕色。整体形象完美。 当我试图太放大时,问题就来了。让我们以这个区域为例。当我处于这种缩放水平时,我的

  • 因此,在学习C的一个步骤中,我决定尝试使用CImg实现mandelbrot集。这是我的程序: 我设法画出经典的曼德尔布洛特形状,但后来我试图实现平滑,以摆脱丑陋的带状。但我不能让它真正工作。 说真的,我不知道我在做什么,因为数学很难。 当保存图像时,我也会收到这个警告 所以很明显我有一个溢出的地方,但我真的不知道在哪里。 如果有人能帮助我,解释我在做什么,并指出我所做的所有错误的事情,但用一种简单

  • 我试图沿着一条线插值颜色,这样,给定两个点及其各自的RGB值,我就可以绘制一条具有平滑颜色渐变的线。使用Bresenham的线条算法,我现在可以绘制线条,但不知道如何开始在两个endpoint之间插值颜色。以下是适用于斜率小于1的所有线条的DrawLine()函数的一部分。 所以我想的是,就像画线一样,我也需要某种决策参数p来确定何时改变RGB值。我在想,随着x的增加,看看每一个rgb值,决定我是