2012-10-23 17 views
0

我试图创建一个使用C++/OpenGL的一个天壤之别的形象。下面是我有这么远过来说出来的简单的代码和图像:我Mandelbrot集有线输出图像

enter image description here

#include<GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 
#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 

double dividecubesby = 300; 
const double left = -2.0; 
const double right = 2.0; 
const double bottom = -2.0; 
const double top = 2.0; 
int maxiteration = 90; 

int mandtest(double Cr, double Ci){ 

    double Zr = 0.0; 
    double Zi = 0.0; 
    int times = 0; 

    Zr = Zr+Cr; 
    Zi = Zi+Ci; 

     while ((((Zr*Zr)+(Zi*Zi))<4) && (times < maxiteration)){ 


     Zr = (Zr*Zr)-(Zi*Zi); 
     Zi = 2*Zr*Zi; 
     Zr = Zr+Cr; 
     Zi = Zi+Ci;     
     times = times+1; 

     } 
return times; 



void display(void) 
{ 
     glClear(GL_COLOR_BUFFER_BIT); 
     glColor3f(1.0f,1.0f,1.0f); 
     double real = left;//this is the real part of the order-pair in the cube 
     double image = top;// this is the image part of the order-pair in the cube 
     double deltax = ((right - left)/(dividecubesby));//this means 4/300 
     double deltay = ((top- bottom)/(dividecubesby));// this means 4/300 

glBegin(GL_POINTS); 

    for(double x= left;x<=right;x += deltax){ 


     for(double y= bottom; y<=top;y += deltay){ 

      if((mandtest(x,y))==maxiteration){ 

       glColor3f(1.0f,1.0f,1.0f); 
          glVertex2f(x,y); 

      } 

      else { 
       glColor3f(0.0f,0.0f,(float)mandtest(x,y)/maxiteration); 
            glVertex2f(x,y); 
      } 

     } 
    } 
    glEnd(); 

glFlush(); 

} 

void init(void) 
{ 
//select clearing (background) color 
    glClearColor(0.0, 0.0, 0.0, 0.0); 

     //initialize viewing values 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
//glortho(left,right,bottom,top,near,far) 
    gluOrtho2D(-2.0, 2.0, -2.0, 2.0); 
} 


int main(int argc, char ** argv) 
{ 
glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
glutInitWindowSize(dividecubesby,dividecubesby); 
glutCreateWindow("A Simple OpenGL Windows Application with GLUT"); 
init(); 
glutDisplayFunc(display); 
glutMainLoop(); 


    return 0; 
} 
+0

我与Java做到了:http://craicpropagation.blogspot.com/2011/03/mandelbrot-set.html。查看代码并查看它是否对您有所帮助。 – duffymo

+2

如果你不想手动处理实部和虚部,C++有std :: complex。 – bames53

+0

库尔bames我一定会尝试.. – solti

回答

4

Zr = (Zr*Zr)-(Zi*Zi); 
    Zi = 2*Zr*Zi; 
    Zr = Zr+Cr; 
    Zi = Zi+Ci; 

您使用新Zr计算Zi,即产生错误的结果,使其成为

double temp = (Zr*Zr)-(Zi*Zi); 
    Zi = 2*Zr*Zi; 
    Zr = temp+Cr; 
    Zi = Zi+Ci; 

,以获得更好的结果:

enter image description here

+0

我试过了,但仍然是相同的图像... :(谢谢大家的响应想到:) – solti

+1

嗯,嗯,这是明显的错误。如果这没有帮助(你应该做出这样的改变,否则你将不会得到一个错误的迭代正确的图片),必须有别的东西。让我们看看我是否找到了一些东西。 –

+0

@gunda糟糕,我犯了同样的错误,我太替换了,很开心。现在修好了,它产生了足够好的照片:) –