Код помогает определить, находится ли точка в наборе Мандельброта (проверьте мое решение) - PullRequest
1 голос
/ 16 апреля 2011

Вот моя функция, которая проверяет две точки x и y, если они находятся в наборе Мандельброта или нет после 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 голосов
/ 16 апреля 2011

Еще одна ошибка: ваша функция принимает int аргументы, поэтому значения ваших double входных данных будут усечены (т.е. дробная часть будет отброшена).

0 голосов
/ 16 апреля 2011

Вы, вероятно, должны проверять выход в цикле while. То есть, если ((a * a + b * b)> 4) в любое время , то этот пиксель сбежал, конец истории. Продолжая итерировать эти пиксели, а также тратить циклы ЦП, вы увеличиваете значения без ограничений и, кажется, превышаете то, что может быть представлено в double - результат равен NaN, поэтому ваши вычисления в finaldist приводят к мусору.

Я думаю, вы бы выиграли от большего разрешения в своей основной. Ваш код, как вы указали здесь, не вычисляет достаточно пикселей, чтобы действительно увидеть большую часть набора.

0 голосов
/ 16 апреля 2011

В вашем коде есть ошибки.Например, вы делаете это:

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

Но на первой итерации j = -1, так что вы получаете значение по индексу -1 массивов.Это не то, что вы хотели сделать.

Кроме того, почему массивы Re и Im - вам действительно нужно отслеживать все промежуточные результаты в вычислениях?

Википедия содержит псевдокод для алгоритма , вы можете проверить свой собственный код по этому.

...