2011-10-20 14 views
6

Sto provando a implementare il set Mandelbrot in C, ma sto avendo uno strano problema. Il mio codice è il seguente:Cosa c'è che non va nel mio codice set 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; 
} 

Tuttavia, l'output di questo programma, che è memorizzato in un file ppm assomiglia a questo:

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

Grazie per il vostro aiuto!

+0

Controlla la tua logica contro questo pseudo codice: http://en.wikipedia.org/wiki/Mandelbrot_set#For_programmers – Blender

+0

Non so se questo è rilevante ma ottengo l'avvertimento: variabile non utilizzata 'reale' quando compilo il tuo codice. –

+0

Stavo sperimentando tecniche diverse per rappresentare i numeri reali e immaginari e ho dimenticato di rimuoverlo. –

risposta

3

impostazione Prova Cimax a -0,127, Sto anche lavorando a questo progetto e sembra fare il trucco;)

2

Il codice sembra buono. Ma il tuo rettangolo di partenza non sembra corretto!

si utilizza

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

Sei sicuro che questo è ciò che si intendeva? Mi sembra una scala y terribilmente tesa.

Inoltre, gli algoritmi standard di Mandelbrot tendono ad utilizzare

magnitude > 2 

anziché 50. come controllo fuga. Anche se questo non dovrebbe influenzare la forma reale del set.

+0

Che risolto! Cambiare la scala in qualcosa come -.127 mi ha dato quello che volevo. Oh, è stato un errore così sciocco. –

0

BTW, non c'è nessun punto nel calcolo della radice quadrata di z * conj (z). Basta quadrare le espressioni su entrambi i lati della disuguaglianza, dando if (z*conj(z) > 2500) e hai aumentato le prestazioni.

Problemi correlati