2016-09-06 1 views
0

Ich versuche Code C++ zu machen, um das Mandlebrot-Set zu plotten. Wenn ich jedoch meinen Code ausführe, siehe unten, ist die Konvergenz schlecht. Wie repariere ich das? Ich habe unten einen Code zur Verfügung gestellt. Es gibt auch einen Screenshot des Mandelbrot-Sets, rot, und die Approximation meines Codes, Graustufen.Wie kann man die Genauigkeit der Iteration verbessern?

#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

Wenn Sie Genauigkeit wollen, verwenden Sie keine Gleitkommaoperationen. –

+0

@Rhymoid Ich fragte mich das gleiche. Es funktioniert, weil sie auf 0 initialisiert und nach jedem Pixel auf Null zurückgesetzt werden. Aber natürlich würde man in der Regel nur das Ineor in der inneren Schleife initalisieren (abhängig vom Compiler könnte dies sogar eine bessere Optimierung ermöglichen). –

+0

@HagenvonEitzen Ja, ich bemerkte das 'ix = 0; iy = 0; 'später. Es ist nicht der am besten lesbare Code. Ich bezweifle, dass Compiler besser funktionieren würden, als wenn 'ix' und' iy' innerhalb der 'for (y- = 3; ...)' - Schleife deklariert werden. –

Antwort

3

Sie sind die falsche ix bei der Berechnung des neuen iy verwenden.

Versuchen

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

Ja, das war das Problem. Danke für die Hilfe! – Zach466920

Verwandte Themen