Author Topic: Mandelbrot Set  (Read 4489 times)

Offline Alberto Dominguez

  • Administrator
  • Jr. Member
  • *****
  • Posts: 64
  • Karma: +0/-0
    • View Profile
Mandelbrot Set
« on: July 11, 2011, 12:41:48 PM »
Sample of Mandelbrot set:



The code associated to it:

Code: [Select]
#include <cstdlib>
#include <stdio.h>
#include <math.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <GL/glut.h>

using namespace std;
void init() {
    glClearColor(1.0,1.0,1.0,0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(-2,1,-1,1);
}

void Mandelbrot() {
  float zx,zy,nzx,nzy;
  int iter = 2500;
  int color;
  bool dentro;

  glBegin(GL_POINTS);
    for (float x=-2; x<=1; x=x+0.001)
    {
        for (float y=-1; y<=1; y=y+0.001)
        {
            zx=0;
            zy=0;
            dentro=true;
            for (int i=0; i<=iter-1; i++)
            {
                nzx=zx*zx-zy*zy+x;
                nzy=2*zx*zy+y;
                zx=nzx;
                zy=nzy;
                if ((zx*zx+zy*zy) > 4.0)
                {
                    color=i;
                    dentro=false;
                    i=iter;
                }
            }
            if (x<0)
               glColor3f(0,color*y*y/15,color*(-x)/25);
            else
               glColor3f(color*x/5,color*y*y/15,0);
            glVertex2f(x,y);
        }
        glFlush();
        glutSwapBuffers();
    }
  glEnd();
  glFlush();
  glutSwapBuffers();
}
 
int main(int argc, char** argv){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE| GLUT_RGB);
    glutInitWindowPosition(50,100);
    glutInitWindowSize(1200,800);
    glutCreateWindow("Conjunto de Mandelbrot");
    init();
    glutDisplayFunc(Mandelbrot);
    glutMainLoop();
    return 0;
}
« Last Edit: July 14, 2011, 12:57:44 AM by Alberto Dominguez »
Kind regards,

Alberto Domínguez
Professional Profile  Twitter

Offline Alberto Dominguez

  • Administrator
  • Jr. Member
  • *****
  • Posts: 64
  • Karma: +0/-0
    • View Profile
Re: Mandelbrot Set
« Reply #1 on: July 12, 2011, 06:59:17 AM »
Improved version that can zoom doing click with the mouse in desired zone (right button zoom out, left button zoom in):











Here is  the code:

Code: [Select]
#include <cstdlib>
#include <stdio.h>
#include <math.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <GL/glut.h>

using namespace std;
float xmin=-2, xmax=1, ymin=-1, ymax=1;
int width=900,height=600;
int fzoom=4, nivel=1;
float xradio= (xmax-xmin)/fzoom;
float yradio= (ymax-ymin)/fzoom;
float iterac=500, fres=500, res=yradio/fres;

void init()
{
    glClearColor(0.0,0.0,0.0,0);
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport (0,0, width, height);
    gluOrtho2D(xmin,xmax,ymin,ymax);
}


void procesarRaton(int button, int state, int x, int y)
{
    float lxmin,lxmax,lymin,lymax;
    float posratonx,posratony;
    if (state == GLUT_DOWN)
    {
        if (button == GLUT_LEFT_BUTTON)
        {
            xradio=xradio/fzoom;
            yradio=yradio/fzoom;
            nivel=nivel+1;
        }
        if (button == GLUT_RIGHT_BUTTON)
        {
            xradio=xradio*fzoom;
            yradio=yradio*fzoom;
            if (nivel > 1)
                nivel=nivel-1;
        }
        res=yradio/fres;
        posratonx=((xmax-xmin)*x/width)+xmin;
        posratony=-((ymax-ymin)*y/height)+ymax;
        lxmin=posratonx-xradio;
        lxmax=posratonx+xradio;
        lymin=posratony-yradio;
        lymax=posratony+yradio;
        xmin=lxmin;
        xmax=lxmax;
        ymin=lymin;
        ymax=lymax;
        glClear(GL_COLOR_BUFFER_BIT);
        glLoadIdentity();
        glViewport (0,0, width, height);
        gluOrtho2D(xmin,xmax,ymin,ymax);
        glutPostRedisplay();
    }
}

void Mandelbrot()
{

  float zx,zy,nzx,nzy;
  int iter = nivel*iterac;
  int color;
  bool dentro;

  glBegin(GL_POINTS);
    for (float x=xmin; x<=xmax; x=x+res)
    {
        for (float y=ymin; y<=ymax; y=y+res)
        {
            zx=0;
            zy=0;
            dentro=true;
            for (int i=0; i<=iter-1; i++)
            {
                nzx=zx*zx-zy*zy+x;
                nzy=2*zx*zy+y;
                zx=nzx;
                zy=nzy;
                if ((zx*zx+zy*zy) > 25.0)
                {
                    color=i;
                    dentro=false;
                    i=iter;
                }
            }
            if (dentro)
                glColor3f(0,0,0);
            else
                if (x<0)
                   glColor3f(0,color*y*y/15,color*(-x)/25);
                else
                   glColor3f(color*x/5,color*y*y/15,0);

            glVertex2f(x,y);
        }
        glFlush();
        glutSwapBuffers();
    }
  glEnd();
  glFlush();
  glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE| GLUT_RGB);
    glutInitWindowPosition(50,100);
    glutInitWindowSize(width,height);
    glutCreateWindow("Conjunto de Mandelbrot");
    init();
    glutMouseFunc(procesarRaton);
    glutDisplayFunc(Mandelbrot);
   
    glutMainLoop();
    return 0;
}
« Last Edit: March 17, 2012, 11:50:23 AM by Alberto Dominguez »
Kind regards,

Alberto Domínguez
Professional Profile  Twitter

Offline Alberto Dominguez

  • Administrator
  • Jr. Member
  • *****
  • Posts: 64
  • Karma: +0/-0
    • View Profile
Re: Mandelbrot Set
« Reply #2 on: April 05, 2012, 08:48:12 AM »
Simply add that I used for development the Netbeans IDE over Fedora.
To install GLUT library in Fedora and link it to Netbeans:

Install package: Freeglut developmental libraries and header files.

And then adding in Netbeans - Project Properties - Linker - Libraries: glut, X11, GL, GLU (case sensitive)

I dont look for the files for libraries, writing their names is enough.  Mysteries of Linux...   :)

In Spanish:

Añadir simplemente que use como IDE para desarrollo Netbeans sobre Fedora.
Para instalar la librería GLUT del OpenGL que hace falta en Fedora y linkarla en Netbeans:

Instalar el paquete: Freeglut developmental libraries and header files.

Y luego añadiendo en el NetBeans - Propiedades del proyecto - Linker - Libraries: glut, X11, GL, GLU (respetando mayúsculas)

Las librerias no he buscado los archivos, simplemente he tecleado esos nombres que se ven ahí... Misterios del Linux...   :)
Kind regards,

Alberto Domínguez
Professional Profile  Twitter