Mandelbrot集

曼德博集合(Mandelbrot set)复平面上点的集合,和朱利亚集有些相似。
下面使用 golang 语言绘制一个曼德博集图。

曼德博集1

曼德博集合可以用复二次多项式来定义:$f_c(z) = z^2 + c$,其中 $c$ 是一个复数参数。
从 $z = 0$ 开始对 $f_c(z)$ 进行迭代,形成以下序列:
$$(0, f_c(0), f_c(f_c(0)), f_c(f_c(f_c(0))), \ldots)$$
不同的参数 $c$ 可能使序列的绝对值逐渐发散到无限大,也可能收敛在有限的区域内。
曼德博集合 $M$ 就是使序列不延伸至无限大的所有复数 $c$ 的集合。

理解

曼德博集多项式和朱利亚集一致,只是朱利亚集给定 $c$,求 $z$ 集,而曼德博是给定 $z = 0$,求 $c$ 集。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func mandelbrot(img *image.RGBA, limit int) {
// z = 0
zx := 0.0
zy := 0.0

for i := 0; i < limit; i++ {
cx := float64(3*i)/float64(limit) - 2
for j := 0; j < limit; j++ {
cy := float64(3*j)/float64(limit) - 1.5
gray := uint8(julia_divergent_grey(zx, zy, cx, cy))
point(img, i, j, color.Gray{gray})
}
}
}

julia_divergent_grey 是上一篇中绘制灰度函数,不在此复述。

测试

1
2
3
4
5
6
7
8
func Test_mandelbrot(t *testing.T) {
const max_len = 1000
img := image.NewRGBA(image.Rect(0, 0, max_len, max_len))
mandelbrot(img, max_len)
f, _ := os.OpenFile("mandelbrot.png", os.O_WRONLY|os.O_CREATE, 0600)
defer f.Close()
png.Encode(f, img)
}

结果:


Mandelbrot集
https://wishlily.github.io/article/code/2017/03/27/undefined/
作者
Wishlily
发布于
2017年3月27日
许可协议