2013-04-20 32 views
6

Aşağıdaki Mandelbrot ayar kodunu C olarak biliyorum. Hesaplamayı yapıyorum ve son fraktal görüntü için bir .ppm dosyası oluşturuyorum. Mesele şu ki, fraktal görüntüüm baş aşağı, yani 90 derece döndürüldü. Kodumu uygulayarak kontrol edebilirsiniz: ./mandel> test.ppmMandelbrot ayar kodumdaki iyileştirme

Diğer taraftan renkleri değiştirmek istiyorum. Bu fraktal görüntü elde etmek istiyorum:

enter image description here

Benim son konu benim kod benim kod çalışma süresini kontrol olmamasıdır. Bu bölüm için de kodum var, ancak kod yürütmesi bittiğinde, çalışma süresini basmıyor. Birisi benim kodumda uygun değişiklikleri yapabilir ve bu fraktal görüntüyü elde etmeme yardımcı olur ve geçen süreyi gösterirse memnun olurum.

#include <math.h> 
#include <stdlib.h> 
#include <time.h> 
#include <stdio.h> 

void color(int red, int green, int blue) 
{ 
    fputc((char)red, stdout); 
    fputc((char)green, stdout); 
    fputc((char)blue, stdout); 
} 

int main(int argc, char *argv[]) 
{ 
    int w = 600, h = 400, x, y; 
    //each iteration, it calculates: newz = oldz*oldz + p, where p is the current pixel, and oldz stars at the origin 
    double pr, pi;     //real and imaginary part of the pixel p 
    double newRe, newIm, oldRe, oldIm; //real and imaginary parts of new and old z 
    double zoom = 1, moveX = -0.5, moveY = 0; //you can change these to zoom and change position 
    int maxIterations = 1000;//after how much iterations the function should stop 

    clock_t begin, end; 
    double time_spent; 

    printf("P6\n# CREATOR: E.T/mandel program\n"); 
    printf("%d %d\n255\n",w,h); 

    begin = clock(); 

    //loop through every pixel 
    for(x = 0; x < w; x++) 
    for(y = 0; y < h; y++) 
    { 
     //calculate the initial real and imaginary part of z, based on the pixel location and zoom and position values 
    pr = 1.5 * (x - w/2)/(0.5 * zoom * w) + moveX; 
     pi = (y - h/2)/(0.5 * zoom * h) + moveY; 
     newRe = newIm = oldRe = oldIm = 0; //these should start at 0,0 
     //"i" will represent the number of iterations 
     int i; 
     //start the iteration process 
     for(i = 0; i < maxIterations; i++) 
     { 
      //remember value of previous iteration 
      oldRe = newRe; 
      oldIm = newIm; 
      //the actual iteration, the real and imaginary part are calculated 
      newRe = oldRe * oldRe - oldIm * oldIm + pr; 
      newIm = 2 * oldRe * oldIm + pi; 
      //if the point is outside the circle with radius 2: stop 
      if((newRe * newRe + newIm * newIm) > 4) break; 
     } 

     color(i % 256, 255, 255 * (i < maxIterations)); 

    } 

    end = clock(); 

    time_spent = (double)(end - begin)/CLOCKS_PER_SEC; 
    printf("Elapsed time: %.2lf seconds.\n", time_spent); 

    return 0; 
} 

cevap

7

Bölüm 1: size doğru dönük fraktal verecektir

for(y = 0; y < h; y++) 
for(x = 0; x < w; x++) 

: Bu hizmeti kullanmak için döngüler sırasını takas gerekir.

Bölüm 2: Bir sürekli pürüzsüz renklendirme almak için :

fprintf(stderr, "Elapsed time: %.2lf seconds.\n", time_spent); 

Bölüm 3: Eğer Stdout'a ppm çıktı yazdırıyorsanız beri stderr bastırmanız gerekmektedir, zaman yazdırmak için almak için Normalleştirilmiş Yineleme Sayısı yöntemini veya benzer bir şeyi kullanmanız gerekir. Ben biraz Normalize Yineleme Sayısı yönteminin basit yaklaşık uygulanmasını yaptım çünkü

if(i == maxIterations) 
     color(0, 0, 0); // black 
    else 
    { 
     double z = sqrt(newRe * newRe + newIm * newIm); 
     int brightness = 256. * log2(1.75 + i - log2(log2(z)))/log2(double(maxIterations)); 
     color(brightness, brightness, 255); 
    } 

Oldukça yoktur: Burada ne arzu size benzer şeyler verir senin boyama bölümü için yerine geçer.

Mandelbrot using some semi-continuous coloring

Bu tamamen kesintisiz boyama değil, ama yakın tür olduğunu.

+0

Teşekkürler! Sorunumu çözdü. Ancak kodunuzun son kısmında parantez ile ilgili küçük bir döküm hatası var. Başka insanlar uğruna düzeltebilirseniz, bu harika olabilir. –

+0

@erkant, çift demek mi (maxIterations)? Gcc ile benim için iyi çalışıyor. Başka bir şey mi? –

+0

Evet, bunun hakkında konuşuyordum. Benim için çalışmadı, parantez gibi kullanmak zorundaydım ((double) maxIterations). –