6

Cでマンデルブロ集合を実装しようとしていますが、奇妙な問題が発生しています。私のコードは次のとおりです。

#include <stdio.h>
#include <math.h>
#include <complex.h>

int iterate_pt(complex c);

int main() {
FILE *fp;
fp = fopen("mand.ppm", "w+");


double crmin = -.75;
double crmax = -.74;
double cimin = -.138;
double cimax = -.75; //Changing this value to -.127 fixed my problem.

int ncols = 256;
int nrows = 256;
int mand[ncols][nrows];
int x, y, color;
double complex c;

double dx = (crmax-crmin)/ncols;
double dy = (cimax-cimin)/nrows;

for (x = 0; x < ncols; x++){
    for (y = 0; y < nrows; y++){
        double complex imaginary = 0+1.0i;
        c = crmin+(x*dx) + (cimin+(y*dy)) * imaginary;
        mand[x][y] = iterate_pt(c);
    }
}

printf("Printing ppm header.");
fprintf(fp, "P3\n");
fprintf(fp, "%d %d\n255\n\n", ncols, nrows);

for (x = 0; x < ncols; x++) {
    for (y = 0; y < nrows; y++){
        color = mand[x][y];
        fprintf(fp, "%d\n", color);
        fprintf(fp, "%d\n", color);
        fprintf(fp, "%d\n\n", color); //Extra new line added, telling the ppm to go to next pixel.
    }
}
fclose(fp);

return 0;
}

int iterate_pt(double complex c){
double complex z = 0+0.0i;
int iterations = 0;
int k;
for (k = 1; k <= 255; k++) {
    z = z*z + c;
    if (sqrt( z*conj(z) ) > 50){
        break;
    }
    else
        ++iterations;
}
return iterations;
}

ただし、ppmファイルとして保存されるこのプログラムの出力は次のようになります。

GIMPを使用してGIFに変換されます。 GIFと元のPPMがPPMとGIFとまったく同じに見えることを確認できます

ご協力いただきありがとうございます!

4

3 に答える 3

3

cimax を -0.127 に設定してみてください。私もこのプロジェクトに取り組んでおり、うまくいくようです ;)

于 2011-10-20T00:54:37.953 に答える
2

コードはよさそうです。しかし、最初の長方形が正しく見えません!

あなたが使用している

Real ranage [  -.75 ,  -.74 ]
Imag range  [ -.138 ,  -.75 ]

これはあなたが意図したものだと確信していますか?私には、非常に引き伸ばされた y スケールのように思えます。

また、標準のマンデルブロ アルゴリズムは、

magnitude > 2

50ではなく。エスケープチェックとして。ただし、これはセットの実際の形状には影響しません。

于 2011-10-20T00:48:13.507 に答える
0

ところで、z*conj(z) の sqrt を計算しても意味がありません。不等式の両側の式を 2 乗するだけでif (z*conj(z) > 2500)、パフォーマンスが向上します。

于 2011-10-28T11:19:23.237 に答える