【问题标题】:How to properly configure coloring for mandelbrot set using python?如何使用 python 正确配置 mandelbrot 集的着色?
【发布时间】:2016-10-16 10:35:45
【问题描述】:

寻找有关 python 的培训我决定使用脚本绘制 mandelbrot 集。绘制它并不太复杂,所以我决定使用颜色,我发现了平滑着色算法。使用this question,我能够渲染出非常漂亮且类似于this one 的东西。

为了实现这一点,我使用三个“步骤”设置了渐变调色板:从深蓝色到浅蓝色,然后是浅蓝色到黄色,最后是黄色到深棕色。整体形象完美。

当我尝试放大时,问题就来了。让我们以this area 为例。当我处于这种缩放级别时,我的脚本不再绘制深蓝色。我想我写错了一些东西,因为无论你在维基百科图像上看到深蓝色的地方,我都有深棕色(所以是我调色板末端的颜色)。当我第一次想到这一点时,我告诉自己如果图案要回到原来的图案,那么它应该使用相同的颜色,因为转义时间应该相同。

那么,这个颜色是在调色板中配置的,还是我不理解逃逸时间?

这是我用于着色的代码:

def color_pixel(n, z):
    smoothcolor = n + 1 - math.log(math.log(abs(z)))/math.log(2)
    f = smoothcolor/iterate_max
    i = int(f*500)
    color = palette[i]
    return color

500 是我调色板中的颜色数量 (len(palette)-1)。

z 超过 10 时 z 的值。

我使用 100 作为最大迭代次数,但相同的结果具有更高的值。

谢谢!

【问题讨论】:

  • 当你放大到你显示的小区域时,该区域的最低迭代不再是1,所以颜色数组低端的颜色不会被使用。 OTOH 在基础级别,很少使用阵列上端的颜色,因此您不会注意到它们。您可以做的一件事是在渲染图像之前找到区域边缘周围的最低迭代次数,并将其用作偏移量。
  • 我缩放的越多,迭代次数就会越高?我应该在调色板上做一个循环,这样颜色就会回来?
  • 没错,低迭代只在第一个比例图像的边缘,你发布的图像告诉你!当您进行实验时,您会发现缩放越深,解决细节所需的迭代次数就越多 - 在 M 集的附近,这通常是您获得有趣的地方图片。
  • ...是的,我使用了一个由迭代 mod 调色板大小索引的调色板,其中颜色平滑地环绕回 index[0]。虽然着色纯粹是主观的,但这取决于你想要做什么。对于动态缩放,每个轮廓的颜色必须始终相同。但是对于单个静态图像,您需要进行实验。因此,并非所有缩放区域都使用相同的着色方法看起来不错。
  • ...在地图的某些区域,整个图像的迭代变化不如其他区域那么大。例如,将主图标图像链接到相同的较小版本的线程。您越接近这些主要或迷你 M 集形状中的任何一个,您会发现的迭代的 范围 越多。

标签: python python-3.x colors mandelbrot


【解决方案1】:

我的着色方法是在三个部分中使用旋转阵列。第一个蓝色交叉渐变为绿色而不使用红色,然后绿色渐变为红色而不使用蓝色,最后红色渐变为(几乎)蓝色而不使用绿色,下一个迭代级别将使用数组底部回绕成纯蓝色迭代的模数。

但是,当我进行所谓的平滑实时缩放时(通过以双倍比例存储数据,然后通过插值在 16 帧之间进行回放),我发现在 M 集的附近,轮廓看起来很混乱,效果很混乱,因为颜色往往会四处乱舞。在那里我使用了不同的方案,将颜色弯曲成灰度。

我的最终着色方法是对具有一个或多个具有相同深度的邻居的像素使用旋转调色板,但根据不同邻居的数量趋向于中灰色。但请记住,动态图像与静态图像的要求不同,不一定需要清晰的细节。

在深度缩放中,提取细节所需的迭代次数可以是 1000 次或更多。我横向解决了这个问题。我不会蛮力地图计算。我开发了一种曲线缝合方法,它遵循迭代级别的轮廓,然后填充该区域。在平滑变化的区域中,这意味着不必迭代大区域。类似地,对于函数没有逃脱的 M-Set 本身 - 我通过再次尝试围绕其边缘然后填充来尽可能避免在那里迭代。这种方法可能会扼杀一些细节,但速度增益是巨大的。在 M-Set 边缘附近的混沌区域中,我的方法是在每个像素处进行迭代。

【讨论】:

    【解决方案2】:

    我现在也在研究这个(配色方案)。由于图像是使用 Ultra Fractal 3 制作的,因此我查看了该程序并四处寻找,最后发现了与您和 wiki 所做的略有不同的细节。它是用一些自定义脚本语言编写的,但希望你能理解它在做什么。代码如下:

    Smooth(OUTSIDE) {
    ;
    ; This coloring method provides smooth iteration
    ; colors for Mandelbrot and other z^2 formula types
    ; (Phoenix, Julia).  Results on other types may be
    ; unpredictable, but might be interesting.
    ;
    ; Thanks to F. Slijkerman for some tweaks.
    ; Thanks to Linas Vepstas for the math.
    ;
    ; Written by Damien M. Jones
    ;
    init:
      complex il = 1/log(@power)        ; Inverse log (power).
      float lp = log(log(@bailout))     ; log(log bailout).
    
    final:
      #index = 0.05 * real(#numiter + il*lp - il*log(log(cabs(#z))))
    
    default:
      title = "Smooth (Mandelbrot)"
      helpfile = "Uf*.chm"
      helptopic = "Html/coloring/standard/smooth.html"
    $IFDEF VER50
      rating = recommended
    $ENDIF
    
      param power
        caption = "Exponent"
        default = (2,0)
        hint = "This should be set to match the exponent of the \
                formula you are using. For Mandelbrot, this is usually 2."
      endparam
      param bailout
        caption = "Bail-out value"
        default = 128.0
        min = 1
        hint = "This should be set to match the bail-out value in \
                the Formula tab. This formula works best with bail-out \
                values higher than 100."
      endparam
    }
    

    我的数学还不够好,不知道如何计算复数的对数,所以我目前无法进一步使用它,但我想我会分享我在这个主题上的发现.

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多