1

MAX_ITERATION 255 の後に 2 つのポイント x と y がマンデルブロ集合に含まれているかどうかをテストする関数を次に示します。含まれていない場合は 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;
}
4

3 に答える 3

0

while ループ内でエスケープをチェックしているはずです。つまり、いつでも ((a*a + b*b) > 4)の場合、そのピクセルはエスケープされており、話は終わりです。doubleこれらのピクセルを反復し続け、CPU サイクルを浪費することにより、値が際限なく増加し、a で表現できる値を超えているように見えNaNます。

メインでより多くの解像度が得られると思います。あなたがここに置いたコードは、セットの多くを実際に見るのに十分なピクセルを計算していません。

于 2011-04-16T12:48:43.510 に答える
0

コードにいくつかのバグがあります。たとえば、次のようにします。

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

しかし、最初の反復でj = -1は、配列のインデックス -1 で値を取得しています。それはあなたがやりたかったことではありません。

また、なぜReIm配列なのですか? 計算の中間結果をすべて追跡する必要があるのでしょうか?

ウィキペディアにはアルゴリズムの疑似コードが含まれています。それに対して自分のコードをチェックすることをお勧めします。

于 2011-04-16T10:04:44.373 に答える
0

別のバグ: 関数がint引数を取るため、double入力の値が切り捨てられます (つまり、小数部分が破棄されます)。

于 2011-04-16T10:10:24.943 に答える