Mandelbrot 设置错误的形状

Mandelbrot Set Wrong Shape

我目前正在尝试编写一个生成 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);
    }
}

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

从数学上讲,您正在从 500 x 500 像素的初始值网格迭代特定函数 f(z)=z^2+z,并且您生成的正是该函数的 Julia 集。要生成 Mandelbrot 集,您需要迭代 f(z)=z^2+c,但现在,您始终使用相同的初始点 0,同时让参数 c 遍及整个网格。

因此,而不是

    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 发生了变化。