Плохая окраска в наборе Мандельброта с C ++ & amp; OpenGL

У меня есть следующий код набора Мандельброта в C ++ для использования с opengl, но цвета не правильные, это нужные цвета:
введите описание изображения здесь

но я получаю это:
введите описание изображения здесь

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

Решение

Вы устанавливаете цвет внутри цикла, который отличается от любого кода Мандельброта, который я видел. Он также устанавливает цвет для одного и того же пикселя много раз, что очень неэффективно. Другой аспект проблемы логики заключается в том, что вы устанавливаете isInside, но никогда не используйте его.

Обычно это делается так, что вы устанавливаете цвет после завершения цикла. Если isInside Значение true, вы устанавливаете черный цвет (или оставляете его нетронутым, если изображение было очищено до черного). В противном случае вы устанавливаете цвет. Если вы посмотрите на происхождение кода, который вы используете, они предлагают определить цвет во «внешнем» случае на основе количества итераций, которое будет n в твоем случае. Код, который вы разместили, использует значение Z_re/Z_im определить цвет.

Изменить: Хорошо, ваша формула использует оба n а также Z_re/Z_im, В любом случае, если вы не знаете точно, что forumula были использованы для эталонного изображения, и использовать то же самое, вы не можете ожидать, точно такой же окраски. Если вы исправите то, что я указал выше, вы должны по крайней мере стать черным внутри.

0

Другие решения


По вопросам рекламы [email protected]