Mandelbrot设置错误的形状

时间:2017-03-17 22:54:35

标签: java eclipse fractals mandelbrot

我目前正在尝试编写一个生成mandelbrot集的程序。尽管我使用每种方法进行了大量测试。整套的形状似乎是错误的。我正在寻求帮助,如果有人知道如何解决它,我会很高兴。

import java.awt.*;
import javax.swing.*;

public class MandelbrotMenge extends JComponent {

    int WIDTH = 600;
    int HEIGHT = 600;
    static int n = 1; // anzahl iterationen

    static double a; // reeller Anteil von komplexer Zahl
    static double b; // imaginärer Anteil

    public MandelbrotMenge(int p_n) {
        setSize(WIDTH, HEIGHT);
        n = p_n;
    }

    public static boolean isMandelbrot(double a_n, double b_n, int n) { // prüft
        // ob
        // komplexe
        // zahl
        // divergiert
        a = a_n;
        b = b_n;
        double a2 ;
        for (int i = 0; i < n; i++) {
            a2 = a * a - b * b + a;    
            b = 2 * a * b + b;
            a=a2;
            if (a * a + b * b >= 4)
                return false;
        }
        return true;    
    }

    public static void zeichneMandelbrot(Graphics g,int n) {    
        for (int i = 100; i <= 600; i++) {
            for (int j = 0; j <= 600; j++) {    
                // i ist pixel und j auch

                // komplexe zahl:
                a = -3 + 0.01 * i; // x min = -3 x max = 6 pixel =600 --> 0.01*i
                b = 3 - 0.01 * j;

                if (isMandelbrot(a, b, n)) {
                    g.setColor(Color.white);
                } else {
                    g.setColor(Color.black);
                }
                g.drawLine(i, j, i, j);    
            }    
        }    
    }

    protected void paintComponent(Graphics g) {
        zeichneMandelbrot(g, n);
    }
}

形状看起来(并非完全)错误:

enter image description here

1 个答案:

答案 0 :(得分:3)

从数学上讲,您是从500 x 500像素的初始值网格迭代特定函数f(z)=z^2+z,而您生成的正是该函数的Julia集。要生成Mandelbrot集,您需要迭代f(z)=z^2+c,但是现在,在整个网格中让参数c范围允许的情况下,总是使用相同的初始点0。

因此,而不是

    a = a_n;
    b = b_n;
    double a2 ;
    for (int i = 0; i < n; i++) {
        a2 = a * a - b * b + a;    
        b = 2 * a * b + b;
        a=a2;
        ...
    }

你需要像

这样的东西
    z_a = 0;
    z_b = 0;
    a = c_a
    b = c_b
    double z_a2 ;
    for (int i = 0; i < n; i++) {
        a2 = z_a * z_a - z_b * z_b + a;    
        b = 2 * z_a * z_b + b;
        a=a2;
        ...
    }

在此代码中,z_az_b代表复杂变量z的实部和虚部,而c_ac_b代表实数和虚数复杂参数c的一部分。迭代始终从零开始,这就是为什么z_az_b在开始时都设置为零的原因。但是,参数c会发生变化。