目录

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$ 集。

实现

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 是上一篇中绘制灰度函数,不在此复述。

测试

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)
}