代码有助于确定点是否在Mandelbrot集中(检查我的解决方案)

时间:2011-04-16 09:59:46

标签: c function ascii mandelbrot

这是我的函数,测试两个点x和y,如果它们在mandelbrot集合中,或者在MAX_ITERATION 255之后没有。如果不是,它应该返回0,如果不是则返回1.

int isMandelbrot (int x, int y) {


    int i;
    int j;
    double Re[255];
    double Im[255];
    double a;
    double b;
    double dist;
    double finaldist;
    int check;

    i=0;
    Re[0]=0;
    Im[0]=0;
    j=-1;
    a=0;
    b=0;

    while (i < MAX_ITERATION) {

        a = Re[j];
        b = Im[j];

        Re[i]=((a*a)-(b*b))+x;
        Im[i]=(2 * a * b) + y;

        i++;
        j++;
    }

    finaldist = sqrt(pow(Re[MAX_ITERATION],2)+pow(Im[MAX_ITERATION],2));

    if (dist > 2) { //not in mandelbrot
        check = 0;
    } else if (dist <= 2) { //in mandelbrot set
        check = 1;
    }

    return check;
}

鉴于它是正确的(有人可以验证......还是写一个更有效的?)。 这是我的代码打印它,但它不起作用! (它不断给出所有点都在集合中)。我在这做错了什么?

int main(void) {

    double col;
    double row;

   int checkSet;

    row = -4;
    col = -1;

    while (row < 1.0 ) {
        while (col < 1.0) {
        checkSet = isMandelbrot(row, col);
            if (checkSet == 1) {
                printf("-");
            } else if (checkSet == 0) {
                printf("*");
            }
            col=col+0.5;
        }
        col=-1;
        row=row+0.5;
        printf("\n");
    }
return 0;
}

3 个答案:

答案 0 :(得分:0)

您的代码中存在一些错误。例如,你这样做:

a = Re[j];
b = Im[j];

但是在第一次迭代时,j = -1,所以你得到了数组索引-1的值。那不是你想要做的。

另外,为什么ReIm数组 - 你真的需要跟踪计算中的所有中间结果吗?

Wikipedia包含the algorithm的伪代码,您可能想要检查自己的代码。

答案 1 :(得分:0)

另一个错误:您的函数需要int个参数,因此double输入的值将被截断(即小数部分将被丢弃)。

答案 2 :(得分:0)

你可能应该在while循环中检查转义。也就是说,如果((a * a + b * b)> 4)在任何时间那么该像素已经逃脱,故事结束。通过继续迭代这些像素,以及浪费CPU周期,您的值不受限制地增长,并且似乎超出double中可以表示的值 - 结果为NaN,因此您的最终计算生产垃圾。

我认为你会受益于你主要的更多分辨率。你把它放在这里的代码并没有计算足够的像素来真正看到它的大部分内容。