不正确的mandelbrot设置输出绘图

时间:2015-04-19 07:03:51

标签: algorithm fractals mandelbrot

我正在尝试编写一个代码来显示Mandelbrot设置的数字 我终端上的(-3,-3)到(2,2)。 主要功能会生成&将复数提供给分析函数。 analyze函数返回字符" *"对于集合中的复数Z和"。"对于位于集合之外的数字。

代码:

#define MAX_A   2       // upperbound on real
#define MAX_B   2       // upper bound on imaginary

#define MIN_A   -3      // lowerbnd on real
#define MIN_B   -3      // lower bound on imaginary

#define NX      300     // no. of points along x
#define NY      200     // no. of points along y

#define max_its 50
int analyze(double real,double imag);
void main()
{
double a,b;
int x,x_arr,y,y_arr;
int array[NX][NY];

int res;

for(y=NY-1,x_arr=0;y>=0;y--,x_arr++)
{
 for(x=0,y_arr++;x<=NX-1;x++,y_arr++)
        {
        a= MIN_A+ (  x/( (double)NX-1)*(MAX_A-MIN_A) );
        b= MIN_B+ (  y/( (double)NY-1 )*(MAX_B-MIN_B) );
        //printf("%f+i%f ",a,b);        
        res=analyze(a,b);

        if(res>49)
                array[x][y]=42;
        else
                array[x][y]=46;


        }
//      printf("\n");

}

for(y=0;y<NY;y++)
        {
        for(x=0;x<NX;x++)
                printf("%2c",array[x][y]);
        printf("\n");
        }

}

analyze函数接受虚平面上的坐标; 并计算(Z ^ 2)+ Z 50次;并且在计算复数是否爆炸时,函数会立即返回,否则函数在完成50次迭代后返回;

  int analyze(double real,double imag)
    {
     int iter=0;
     double r=4.0;

            while(iter<50)
            {
                    if (  r < ( (real*real) + (imag*imag) )  )
                    {
                            return iter;
                    }
                    real=  ( (real*real) - (imag*imag) + real);
                    imag=  ( (2*real*imag)+ imag);
                    iter++;
            }
            return iter;

    }

所以,我正在分析60000(NX * NY)数字&amp;在终端上显示它 考虑到3:2的比例(300,200),我甚至尝试了4:3(NX:NY),但输出保持不变,并且生成的形状甚至没有接近mandlebrot集:

enter image description here

因此,输出显示为反转, 我浏览了&amp;遇到过如下行:

   (x - 400) / ZOOM;
   (y - 300) / ZOOM;

关于许多mandelbrot代码,但我无法理解这一行如何纠正我的输出。

我想我在将输出映射到终端时遇到了麻烦!

(LB_Real,UB_Imag) --- (UB_Real,UB_Imag)
    |                       |
(LB_Real,LB_Imag) --- (UB_Real,LB_Imag)

任何提示/帮助都非常有用

1 个答案:

答案 0 :(得分:2)

Mandelbrot复发是z n + 1 = z n 2 + c。

以下是您的实施:

real=  ( (real*real) - (imag*imag) + real);
imag=  ( (2*real*imag)+ imag);

问题1.在您使用旧值计算新real之前,您正在将imag更新为下一个值。

问题2.假设你修复了问题1,你正在计算z​​ n + 1 = z n 2 + z ñ

以下是我使用double

的方式
int analyze(double cr, double ci) {
    double zr = 0, zi = 0;
    int r;
    for (r = 0; (r < 50) && (zr*zr + zi*zi < 4.0); ++r) {
        double zr1 = zr*zr - zi*zi + cr;
        double zi1 = 2 * zr * zi + ci;
        zr = zr1;
        zi = zi1;
    }
    return r;
}

但如果您对复数使用标准C99支持,则更容易理解:

#include <complex.h>

int analyze(double cr, double ci) {
    double complex c = cr + ci * I;
    double complex z = 0;
    int r;
    for (r = 0; (r < 50) && (cabs(z) < 2); ++r) {
        z = z * z + c;
    }
    return r;
}