看明白Julia集

在复杂动力学里,Julia集是个著名的“混沌”行为的集(与之对应的是Fatou集,“非混沌”集)

主要表现是无法预测下一个点的位置,但是把所有点画完就可以出来一个非常好看的图


比如说Julia集的一个公式: - z = z^2 + c

其中z c都是复数,c是复数常量,z中的实数部和虚数部构成一个点,然后不同的迭代迭代,不发散的点构成的点集就称为Julia集(Julia发现的),这些点构成的图形就形成了一个Julia集的分形图。

当然大家都发现了公式右边是z的平方吧?如果我改下这个数字会怎么样呢?

From Wikipedia)我们由此可以猜测,z的几次方就对应他有几个“角”。

他还有个特点就是“自相似

Example :

右上的和左下的是不是相似

大概公式里面也能说明,因为他的下一个位置都是由他自己乘自己得到。

现在搞清楚了Julia集是咋回事,那么他的公式中的常量C有什么用呢?

常量C可厉害了

C = a + bi(a b取值范围都是-1 到 1)

我们先试验下,让a = 0(实数为0) b从-1 到 1 再回到 -1来看图像会怎么样

然后令b = 0(虚数为0), a从-1 到 1 再回到-1 ,我们看看效果:

可以看出常量C的实数和虚数就是控制这图案的形状的量。

那么应该怎么画这个图形?

代码附上:

void drawJuliaSet(Graphics2D g) {
        BufferedImage image = new BufferedImage(w, h,
                BufferedImage.TYPE_INT_RGB);//w h为窗体宽度和高度
        double zx, zy, cX, cY;//这里就是cX和cY

        for (int x = 0; x < w; x++) {//套公式
            for (int y = 0; y < h; y++) {
                zx = 1.5 * (x - w / 2) / w;
                zy = (y - h / 2) / w;
                float i = 200;
                while (zx * zx + zy * zy < 4 && i > 0) {
                    double tmp = zx * zx - zy * zy + cX;
                    zy = 2.0 * zx * zy + cY;
                    zx = tmp;
                    i--;
                }//依据收敛性设置颜色
                int c = Color.HSBtoRGB((200 / i) % 1, 1, i > 0 ? 1 : 0);
                image.setRGB(x, y, c);
            }
        }
        g.drawImage(image, 0, 0, null);
    }

要做出动画效果还是有点困难,因为每张图要花0.2s~0.4s,分辨率高了就更难受,所以我选择预先画200张,再把图片一次性画完

上面都是源于公式: z=z^2+c

大家可以自己用手先试试,收敛的点放在一起就能组成这样的分形图,甚至,您都可以用控制台画出Julia集的分形图

像这样

哈哈哈,不敢相信吧,那么赶紧带上代码去旅行吧!

发布于 2017-08-08 15:54