我的 Mandelbrot 看起来不应该。有谁知道为什么?
My Mandelbrot does not look like it should. Does anyone know why?
我最近发现了 Mandelbrot 集,现在我正尝试在 Processing 3.0 中生成一个 Mandelbrot 集。我在 youtube 上找到了一个关于编程的教程,并试图在 Progressing 中实现它。
background(255);
size(1280, 720);
}
void draw(){
int maxIteration = 100;
double reMid = -0.75;
double iMid = 0;
double rangeR = 3.5;
double rangeI = 2;
double xPixels = 1280;
double yPixels = 720;
for(int x = 0; x < xPixels; x++){
for(int y = 0; y < yPixels; y++){
double xP = (double)x / xPixels;
double yP = (double)y / yPixels;
double cReal = xP * rangeR + reMid - rangeR / 2;
double cIm = yP * rangeI + iMid - rangeI / 2;
double zReal = 0;
double zIm = 0;
int iteration = 0;
while(iteration < maxIteration && zReal * zReal + zIm * zIm <= 4) {
double temp = zReal * zReal - cIm * cIm + cReal;
zIm = 2 * zReal * zIm + cIm;
zReal = temp;
iteration++;
}
if(iteration >= maxIteration - 1){
stroke(0);
}
else{
stroke(255);
}
point(x, y);
}
}
}
但是当我生成 Mandelbrot 集时,它看起来与应有的不同:
我已经将我的代码与视频中的代码进行了比较,但我没有发现我的代码有错误。
有谁知道,我做错了什么?
我把它缩小了一点,长长的尾巴一直延伸到无穷远。由于所有 |C| > 2
都应该发散,因此很容易找到失败的特定情况,例如 cReal = 2; cImg = -1.5;
你的代码说它收敛了,但手工计算表明它很快发散:
Z0 = 0 + 0i
Z1 = (0 + 0i)^2 + 2 - 1.5i = 2 - 1.5i
Z2 = 2*2 - 2*2*1.5i - 1.5^2 = 1.75 - 6i
逐步执行您的代码会得到 zReal, zImg
-1.5, -0.25
-0.75, -0.1875
-1.21875, -0.21484375
-0.976318359375, -0.2038421630859375
-1.1019703075289726, -0.20844837254844606
[...]
换句话说,你的循环是错误的。立即怀疑的代码行是这样的:
double temp = zReal * zReal - cIm * cIm + cReal;
它正在做 cIm*cIm
,但不应该对 C 的任何组件进行任何乘法运算:它只是在末尾添加。
所以发生的事情是您不小心将 zIm
换成了 cIm
。
将它们切换回来,您应该会得到更好的结果:
double temp = zReal * zReal - zIm * zIm + cReal;
我最近发现了 Mandelbrot 集,现在我正尝试在 Processing 3.0 中生成一个 Mandelbrot 集。我在 youtube 上找到了一个关于编程的教程,并试图在 Progressing 中实现它。
background(255);
size(1280, 720);
}
void draw(){
int maxIteration = 100;
double reMid = -0.75;
double iMid = 0;
double rangeR = 3.5;
double rangeI = 2;
double xPixels = 1280;
double yPixels = 720;
for(int x = 0; x < xPixels; x++){
for(int y = 0; y < yPixels; y++){
double xP = (double)x / xPixels;
double yP = (double)y / yPixels;
double cReal = xP * rangeR + reMid - rangeR / 2;
double cIm = yP * rangeI + iMid - rangeI / 2;
double zReal = 0;
double zIm = 0;
int iteration = 0;
while(iteration < maxIteration && zReal * zReal + zIm * zIm <= 4) {
double temp = zReal * zReal - cIm * cIm + cReal;
zIm = 2 * zReal * zIm + cIm;
zReal = temp;
iteration++;
}
if(iteration >= maxIteration - 1){
stroke(0);
}
else{
stroke(255);
}
point(x, y);
}
}
}
但是当我生成 Mandelbrot 集时,它看起来与应有的不同:
我已经将我的代码与视频中的代码进行了比较,但我没有发现我的代码有错误。 有谁知道,我做错了什么?
我把它缩小了一点,长长的尾巴一直延伸到无穷远。由于所有 |C| > 2
都应该发散,因此很容易找到失败的特定情况,例如 cReal = 2; cImg = -1.5;
你的代码说它收敛了,但手工计算表明它很快发散:
Z0 = 0 + 0i
Z1 = (0 + 0i)^2 + 2 - 1.5i = 2 - 1.5i
Z2 = 2*2 - 2*2*1.5i - 1.5^2 = 1.75 - 6i
逐步执行您的代码会得到 zReal, zImg
-1.5, -0.25
-0.75, -0.1875
-1.21875, -0.21484375
-0.976318359375, -0.2038421630859375
-1.1019703075289726, -0.20844837254844606
[...]
换句话说,你的循环是错误的。立即怀疑的代码行是这样的:
double temp = zReal * zReal - cIm * cIm + cReal;
它正在做 cIm*cIm
,但不应该对 C 的任何组件进行任何乘法运算:它只是在末尾添加。
所以发生的事情是您不小心将 zIm
换成了 cIm
。
将它们切换回来,您应该会得到更好的结果:
double temp = zReal * zReal - zIm * zIm + cReal;