如何使用 python 正确配置 mandelbrot 集的着色?
How to properly configure coloring for mandelbrot set using python?
寻找有关 python 的培训,我决定使用脚本绘制 mandelbrot 集。画它并不太复杂,所以我决定使用颜色,我发现了平滑着色算法。使用 this question I was able to render something really beautiful and similar to this one.
为了实现这一点,我使用三个 "steps" 设置了渐变调色板:从深蓝色到浅蓝色,然后从浅蓝色到黄色,最后从黄色到深棕色。整体形象完美。
当我尝试放大时出现问题。让我们以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 z 超过 10 时的值。
我使用 100 作为最大迭代次数,但结果相同但值更高。
谢谢!
我的上色方法是分三段旋转排列。首先蓝色交叉淡化为绿色而不使用红色,然后绿色交叉淡化为红色而不使用蓝色,最后红色到(几乎)蓝色而不使用绿色,下一个迭代级别将通过使用回绕到数组底部的纯蓝色迭代的模数。
然而,当我做了一个所谓的平滑实时缩放(通过以双倍比例存储数据,然后通过插值在中间 16 帧进行播放)时,我发现在 M-set 附近,其中轮廓看起来很混乱,效果很乱,因为颜色往往会四处乱舞。在那里我使用了不同的方案,将颜色弯曲成灰度。
我的最终着色方法是对具有一个或多个深度相同深度的像素使用旋转调色板,但根据不同的邻居数量趋向于中灰色。但请记住,动态图像的要求不同于静态图像,清晰的细节不一定是理想的。
在深度缩放下,提取细节所需的迭代次数可以达到 1000 次或更多。我横向解决了这个问题。我不会强制执行地图计算。我开发了一种曲线缝合方法,它遵循迭代级别的轮廓,然后填充该区域。在平滑变化的区域中,这意味着不必迭代大区域。类似地,对于函数没有逃逸的 M-Set 本身——我通过再次尝试绕过它的边缘然后填充来尽可能地避免在那里迭代。这种方法可能会删除一些细节,但速度增益是巨大的。在 M-Set 边缘附近的混沌区域,我的方法是在每个像素处迭代。
我现在也在研究这个(配色方案)。由于图像是使用 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
}
我的数学不够好,不知道如何计算复数的对数,所以我现在无法进一步使用它,但我想我会分享我在这个话题。
寻找有关 python 的培训,我决定使用脚本绘制 mandelbrot 集。画它并不太复杂,所以我决定使用颜色,我发现了平滑着色算法。使用 this question I was able to render something really beautiful and similar to this one.
为了实现这一点,我使用三个 "steps" 设置了渐变调色板:从深蓝色到浅蓝色,然后从浅蓝色到黄色,最后从黄色到深棕色。整体形象完美。
当我尝试放大时出现问题。让我们以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 z 超过 10 时的值。
我使用 100 作为最大迭代次数,但结果相同但值更高。
谢谢!
我的上色方法是分三段旋转排列。首先蓝色交叉淡化为绿色而不使用红色,然后绿色交叉淡化为红色而不使用蓝色,最后红色到(几乎)蓝色而不使用绿色,下一个迭代级别将通过使用回绕到数组底部的纯蓝色迭代的模数。
然而,当我做了一个所谓的平滑实时缩放(通过以双倍比例存储数据,然后通过插值在中间 16 帧进行播放)时,我发现在 M-set 附近,其中轮廓看起来很混乱,效果很乱,因为颜色往往会四处乱舞。在那里我使用了不同的方案,将颜色弯曲成灰度。
我的最终着色方法是对具有一个或多个深度相同深度的像素使用旋转调色板,但根据不同的邻居数量趋向于中灰色。但请记住,动态图像的要求不同于静态图像,清晰的细节不一定是理想的。
在深度缩放下,提取细节所需的迭代次数可以达到 1000 次或更多。我横向解决了这个问题。我不会强制执行地图计算。我开发了一种曲线缝合方法,它遵循迭代级别的轮廓,然后填充该区域。在平滑变化的区域中,这意味着不必迭代大区域。类似地,对于函数没有逃逸的 M-Set 本身——我通过再次尝试绕过它的边缘然后填充来尽可能地避免在那里迭代。这种方法可能会删除一些细节,但速度增益是巨大的。在 M-Set 边缘附近的混沌区域,我的方法是在每个像素处迭代。
我现在也在研究这个(配色方案)。由于图像是使用 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
}
我的数学不够好,不知道如何计算复数的对数,所以我现在无法进一步使用它,但我想我会分享我在这个话题。