在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作为最大迭代但是相同的结果具有更高的值。
谢谢 !
我的着色方法是在三个部分中使用旋转阵列。第一个蓝色交叉渐变为绿色而不使用红色,然后绿色到红色而不使用蓝色,最后红色到(几乎)蓝色没有绿色,其中下一个迭代级别将通过使用回退到阵列底部的纯蓝色迭代模数。
然而,当我做了一个假设平滑的实时变焦(通过以倍增比例存储数据,然后通过插值来回放16帧之间)时,我发现在M-set的邻域中,轮廓看起来很混乱,因为颜色往往会跳舞,所以效果很混乱。在那里我使用了不同的方案,将颜色弯曲成灰度。
我的最终着色方法是将旋转调色板用于具有相同深度的一个或多个邻居的像素,但是根据有多少邻居不同而倾向于中灰色。但请记住,对运动图像的要求与静态图像不同,并且不一定需要清晰的细节。
在深度缩放时,提取细节所需的迭代次数可以是1000或更多。我横向解决了这个问题。我不蛮力地计算地图。我开发了一种曲线拼接方法,它遵循迭代级别的轮廓,然后填充该区域。在平滑变化的区域中,意味着不需要迭代大区域。类似地,对于M-Set本身,函数没有被转义 - 我尽可能避免在那里迭代,再次尝试沿着它的边缘然后填充。这种方法可能会扼杀一些细节,但速度增加是巨大的。在M-Set边缘附近的混沌区域,我的方法就是迭代每个像素。
我现在也在考虑这个(着色方案)。由于图像是使用Ultra Fractal 3制作的,我查看了该程序并进行了搜索并最终找到了详细信息,这与您和维基的操作略有不同。它是用一些自定义脚本语言编写的,但希望你能理解它在做什么。这是代码:
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
}
我的数学不够好,不知道如何计算复数的对数,所以我现在仍然坚持使用它,但我想我会分享我在这个主题上发现的东西。