【问题标题】:Code help to determine if point is in Mandelbrot set (check my solution)确定点是否在 Mandelbrot 集中的代码帮助(检查我的解决方案)
【发布时间】:2011-04-16 09:59:46
【问题描述】:

这是我的函数,它测试两个点 x 和 y 是否在 MAX_ITERATION 255 之后是否在 mandelbrot 集中。如果不是,它应该返回 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;
}

【问题讨论】:

  • 你似乎没有从main()调用你的函数...
  • 哎呀,复制了错误的主目录。
  • 效率详情:不要使用pow(xxx, 2)pow 函数旨在计算任意数字的 x^y。它将通过使用复杂算法的近似来做到这一点。请改用x*xsqrt(x) &lt; 2x &lt; 4 相同,但速度更快。 (这在 20 年前我在 C64 上画曼德布罗时非常明显。)

标签: c function ascii mandelbrot


【解决方案1】:

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

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

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

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

维基百科包含the algorithm 的伪代码,您可能需要检查您自己的代码。

【讨论】:

  • 谢谢,我已经阅读了伪代码,但我仍然遇到困难......我对 C (或就此进行编程)相当陌生,你能指导我到 C 版本吗? (我可以开始)
  • @Carpe Diem Google for "mandelbrot in c",例如,你会发现很多例子。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    我认为你会从你的主要解决方案中受益。您放在这里的代码没有计算足够的像素来真正看到大部分集合。

    【讨论】:

    • 确实,加载图像需要相当长的时间。修复感谢您的提示!
    猜你喜欢
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多