Mandelbrot中的Bad Coloring设置为C ++& OpenGL的

时间:2014-04-19 02:19:05

标签: c++ opengl mandelbrot

我在C ++中使用以下Mandelbrot设置代码与opengl一起使用,但颜色不正确,这些是所需的颜色: enter image description here

但我得到了这个: 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);
}

任何人都知道为什么会发生这种情况以及如何解决这个问题?

非常感谢。

1 个答案:

答案 0 :(得分:0)

你在循环中设置颜色,这与我见过的任何Mandelbrot代码都不同。它还多次为同一像素设置颜色,效率非常低。逻辑问题的另一个方面是你设置isInside,但从不使用它。

通常这样做的方法是在循环终止后设置颜色。如果isInside为真,则将颜色设置为黑色(如果图像被清除为黑色,则保持不变)。否则你设置颜色。如果您查看origin of the code you use,他们建议您确定&#34;外部&#34;的颜色。基于迭代次数的情况,在您的情况下为n。您发布的代码使用Z_re/Z_im的值来确定颜色。

编辑:好的,您的公式同时使用nZ_re/Z_im。在任何情况下,除非您确切知道参考图像使用了哪些论坛,并且您使用相同的论坛,否则您无法期望完全相同的着色。如果你解决了我上面提到的问题,那么至少应该让内部变黑。