我目前正在尝试编写一个生成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);
}
}
形状看起来(并非完全)错误:
答案 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_a
和z_b
代表复杂变量z
的实部和虚部,而c_a
和c_b
代表实数和虚数复杂参数c
的一部分。迭代始终从零开始,这就是为什么z_a
和z_b
在开始时都设置为零的原因。但是,参数c
会发生变化。