2011-10-20 3 views
6

C에서 Mandelbrot 세트를 구현하려고하는데 이상한 문제가 있습니다. 다음과 같이 내 코드는 다음과 같습니다Mandelbrot 세트 코드에 어떤 문제가 있습니까?

#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 파일로 저장이 프로그램의 출력은 다음과 같습니다 : 당신의 도움에 대한

Converted to a GIF using GIMP. I can confirm that the GIF and original PPM look exactly the same as a PPM and GIF

감사합니다!

+0

이 의사 코드에 대한 논리를 확인하십시오 : http://en.wikipedia.org/wiki/Mandelbrot_set#For_programmers – Blender

+0

이 경우 관련성이 있지만 컴파일 할 때'경고 : 사용되지 않은 변수 '가 표시되는지 모르겠습니다. 당신의 코드. –

+0

저는 실제와 허수를 나타내는 다른 기술을 실험하고 있었고이를 제거하는 것을 잊었습니다. –

답변

3

시도 설정 cimax -0.127로, 나는 또한이 프로젝트에서 일하고 있어요 그리고 트릭을 할 것으로 보인다. 불평등의 양면에 표현식을 두어 간단히 if (z*conj(z) > 2500)으로 지정하면 성능이 향상됩니다.

2

코드가 좋아 보인다. 그러나 시작 사각형이 제대로 보이지 않습니다!

당신은

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

당신이 당신의 의도를 확신하는 사용하고 있습니까? 그것은 나에게 몹시 뻗어있는 y- 규모처럼 보인다.

또한 표준 만델 알고리즘 이탈 검사로

magnitude > 2 

보다는 50 를 사용하는 경향이있다. 이것은 세트의 실제 모양에 영향을주지 않습니다.

+0

그걸 고쳐 줘! -127과 같은 것으로 규모를 변경하면 내가 원하는 것을 얻을 수 있습니다. 오, 그건 바보 같은 실수 였어. –

0

은 BTW, Z의 *의 접속사 (Z)의 SQRT를 계산 아무 소용이 없다)

관련 문제