2014-04-19 2 views
1

je les suivantes Mandelbrot code en C++ pour une utilisation avec opengl mais les couleurs ne sont pas correctes, ce sont les couleurs souhaitées: enter image description hereBad coloriage en Mandelbrot avec C++ et OpenGL

mais je reçois ceci: enter image description here

int vala = 600; 
int valb = 600; 
//render one frame 
void Application::render(void) 
{ 
    // Clear the window and the depth buffer 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    //render grid 

    Image img(vala, valb); 
    double MinRe = -2.0; 
    double MaxRe = 1.0; 
    double MinIm = -1.2; 
    double MaxIm = MinIm+(MaxRe-MinRe)*vala/valb; 
    double Re_factor = (MaxRe-MinRe)/(vala-1); 
    double Im_factor = (MaxIm-MinIm)/(valb-1); 
    unsigned MaxIterations = 250; 
    for(unsigned int y = 0; y < img.height; y++){ 
     double c_im = MaxIm - y*Im_factor; 
     for(unsigned x=0; x< img.width; ++x){ 
      double c_re = MinRe + x*Re_factor; 
      double Z_re = c_re, Z_im = c_im; 
      bool isInside = true; 
      for(unsigned n=0; n<MaxIterations; ++n){ 

       double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im; 
       if(Z_re2 + Z_im2 > 4) 
       { 
        isInside = false; 
        break; 
       } 

       Z_im = 2*Z_re*Z_im + c_im; 
       Z_re = Z_re2 - Z_im2 + c_re; 


       double z = sqrt(Z_re*Z_re + Z_im*Z_im); 
       int brightness = 256. *log(1.75 + n - log(log(z))); 
       img.setPixel(x,y, Color(sin(time)*brightness, sin(time/2)*brightness, brightness)); 



      } 


      } 

     } 


    img.scale(this->window_width, this->window_height); 

    renderImage(&img); 

    //swap between front buffer and back buffer 
    SDL_GL_SwapWindow(this->window); 
} 

Quelqu'un sait pourquoi cela se produit et comment y remédier?

Merci beaucoup.

+1

À part 'glClear (...)', il n'y a pas un seul bit de code GL ici. Je suppose que l'implémentation de 'Image' ou' renderImage (...) 'est à blâmer, mais aucun d'eux n'est montré. Si vous produisez directement dans un fichier image au lieu de GL, cela change-t-il quelque chose? –

+0

@ AndonM.Coleman Il ne peut pas être beaucoup de code openGL, mais le reste du programme comprend de nombreuses lignes de code openGL donc le programme lui-même doit être 100% OpenGL supporté. Image et renderImage ne sont pas le problème, je le garantis. Le problème vient de l'équation pour imprimer les couleurs ... – Gera

+0

Oh, je vois. J'ai interprété la question comme si l'image sur le dessus était * également * générée en utilisant ce code et que l'image faussée était le résultat d'une tentative d'affichage dans GL. –

Répondre

0

Vous définissez la couleur à l'intérieur de la boucle, ce qui est différent de tout code Mandelbrot que j'ai vu. Il définit également la couleur pour le même pixel plusieurs fois, ce qui est très inefficace. Un autre aspect du problème de logique est que vous définissez isInside, mais ne l'utilisez jamais.

La façon dont cela est généralement fait est que vous définissez la couleur après la fin de la boucle. Si isInside est true, vous définissez la couleur sur noir (ou la laissez intacte si l'image a été désactivée au noir). Sinon, vous définissez la couleur. Si vous regardez le origin of the code you use, ils suggèrent de déterminer la couleur dans le cas «extérieur» basé sur le nombre d'itérations, qui serait n dans votre cas. Le code que vous avez publié utilise la valeur Z_re/Z_im pour déterminer la couleur. Editer: Ok, votre formule utilise à la fois n et Z_re/Z_im. Dans tous les cas, à moins de savoir exactement quels forumula ont été utilisés pour l'image de référence, et vous utilisez la même chose, vous ne pouvez pas vous attendre exactement à la même couleur. Si vous réparez ce que j'ai indiqué ci-dessus, vous devriez au moins obtenir du noir pour l'intérieur.