2016-09-06 2 views
0

Я пытаюсь создать код, C++, чтобы построить набор Мандельброта. Однако всякий раз, когда я запускаю свой код, см. Ниже, конвергенция оставляет желать лучшего. Как это исправить? Я привел некоторый код ниже. Также есть скриншот набора Мандельброта, красного цвета и приближения моего кода, оттенков серого.Как повысить точность итерации?

#include <GL/glut.h> 

void renderscene(void) { 

    double x=0; 
    double y=0; 
    double ix=0; 
    double iy=0; 
    int n=1; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    for(x=-3;x<3;x=x+0.01){ 
    for(y=-3;y<3;y=y+0.01){ 

     for(n=1;n<50;n=n+1){ 
     ix=ix*ix-iy*iy+x; 
     iy=2*iy*ix+y; 
     if(ix*ix+iy*iy>4){ 
      break; 
     } 
     } 

     ix=0; 
     iy=0; 

     glPointSize(1); 
     glColor3f(0.1*n,0.1*n,0.1*n); 
     glBegin(GL_POINTS); 
     glVertex2f(x*0.4,y*0.4); 
     glEnd(); 
    } 
    } 

    glutSwapBuffers(); 

} 


int main(int argc, char **argv) { 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA); 
    glutInitWindowPosition(300,200); 
    glutInitWindowSize(500,500); 
    glutCreateWindow("Hello"); 

    glutDisplayFunc(renderscene); 

    glutMainLoop(); 

    return 1; 
} 

enter image description here

enter image description here

+2

Если вы хотите точность, не следует использовать операции с плавающей точкой. –

+0

@Rhymoid Мне было интересно то же самое. Он работает, потому что они инициализированы до 0 и сбрасываются до нуля после каждого пикселя. Но, конечно, обычно можно было бы просто инициализировать до начала во внутреннем цикле (в зависимости от компилятора это могло бы даже позволить улучшить оптимизацию) –

+0

@HagenvonEitzen Да, я заметил 'ix = 0; iy = 0; "позже. Это не самый читаемый код. Я сомневаюсь, что компиляторы будут работать лучше, чем когда 'ix' и' iy' объявлены в 'for (y- = 3; ...)' -loop. –

ответ

3

Вы используете в вычислении нового iy неправильный ix.

Попробуйте

double nextix=ix*ix-iy*iy+x; 
iy=2*iy*ix+y; 
ix = nextix; 
+0

Да, это была проблема. Спасибо за помощь! – Zach466920

Смежные вопросы