2011-10-20 34 views
6

Tôi đang cố triển khai tập hợp Mandelbrot trong C, nhưng tôi đang gặp vấn đề lạ. Mã của tôi là như sau:Có gì sai với mã thiết lập Mandelbrot của tôi?

#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; 
} 

Tuy nhiên, sản lượng của chương trình này, được lưu trữ dưới dạng file ppm trông như thế này:

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

Nhờ sự giúp đỡ của bạn!

+0

Kiểm tra logic của bạn dựa vào mã giả này: http://en.wikipedia.org/wiki/Mandelbrot_set#For_programmers – Blender

+0

Tôi không biết điều này có liên quan hay không nhưng tôi nhận được 'cảnh báo: biến không sử dụng 'thực' khi tôi biên dịch ma cua ban. –

+0

Tôi đã thử nghiệm các kỹ thuật khác nhau để thể hiện số thực và số ảo, và quên xóa nó. –

Trả lời

3

thiết lập Thử cimax để -0,127, tôi cũng đang làm việc trên dự án này và có vẻ như để làm các trick;)

2

Mã có vẻ tốt. Nhưng hình chữ nhật bắt đầu của bạn trông không đúng!

bạn đang sử dụng

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

bạn có chắc đây là những gì bạn mong đợi? Nó có vẻ như một quy mô y khủng khiếp kéo dài đến tôi.

Ngoài ra, thuật toán Mandelbrot chuẩn xu hướng sử dụng

magnitude > 2 

chứ không phải 50. như một séc thoát. Mặc dù điều này không ảnh hưởng đến hình dạng thực tế của bộ này.

+0

Điều đó đã sửa nó! Thay đổi tỷ lệ thành một cái gì đó như -.127 đã cho tôi những gì tôi muốn. Oh đó là một sai lầm ngớ ngẩn. –

0

BTW, không có điểm nào trong tính toán sqrt của z * conj (z). Đơn giản chỉ cần vuông các biểu thức trên cả hai mặt của sự bất bình đẳng, cho if (z*conj(z) > 2500) và bạn đã tăng hiệu suất.

Các vấn đề liên quan