如何使用python正确配置mandelbrot集的着色?

时间:2016-10-16 10:35:46

标签: python python-3.x colors mandelbrot

在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作为最大迭代次数,但结果相同且值更高。

谢谢!

2 个答案:

答案 0 :(得分:0)

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

然而,当我做了一个假设平滑的实时变焦(通过以倍增比例存储数据,然后通过插值来回放16帧之间)时,我发现在M-set的附近,轮廓在哪里看起来很乱,效果很混乱,因为颜色往往会跳舞。在那里,我使用了一种不同的方案,将颜色弯曲成灰度。

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

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

答案 1 :(得分:0)

我现在也在研究这个问题(配色方案)。由于图像是使用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
}

我的数学不足以知道如何计算复数的对数,因此我暂时无法继续使用它,但我想我会分享在该主题上发现的内容