Ir a contenido


MENSAJE DE BIENVENIDA Foro vínculado con Twitter, más info aquí.

“El secreto para progresar es empezar por algún lugar. El secreto para empezar por algún lugar es fragmentar tus complejas y abrumadoras tareas de tal manera que queden convertidas en pequeñas tareas que puedas realizar y entonces simplemente comenzar por la primera.” - Mark Twain

Foto

Conjunto de Mandelbrot


  • Please log in to reply
4 replies to this topic

#1 Alberto Dominguez

Alberto Dominguez

    Gurú

  • Administradores
  • 1.059 Mensajes:
  • LocationMadrid

Escrito 11 marzo 2011 - 18:19

Dejo por aquí una imagen de un conjunto de Mandelbrot:

Imagen enviada

Y aquí el código asociado en C:

#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 = 500;
  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 (dentro)
                glColor3f(0,0,0);
            else
               glColor3f(color*x*x/40,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;
}

Saludos,

Alberto Dominguez

Enterprise Architect y Trainer
MCT, MCPD, MCITP, MCITP Dynamics, MCSE, MCSA, MCTS, MCP...
ITIL V3 Foundation Qualification in IT Service Management
Imagen enviadaPerfil Profesional Imagen enviadaTwitter
Imagen enviadaImagen enviadaImagen enviadaImagen enviada

#2 Alberto Dominguez

Alberto Dominguez

    Gurú

  • Administradores
  • 1.059 Mensajes:
  • LocationMadrid

Escrito 11 marzo 2011 - 19:08

Por aquí dejo una variante a mayor tamaño y más elaborada:

Imagen enviada

Color:
if (x<0)
  glColor3f(color*(-x)/25,color*y*y/15,0);
else
  glColor3f(color*x/5,color*y*y/15,0);

Saludos,

Alberto Dominguez

Enterprise Architect y Trainer
MCT, MCPD, MCITP, MCITP Dynamics, MCSE, MCSA, MCTS, MCP...
ITIL V3 Foundation Qualification in IT Service Management
Imagen enviadaPerfil Profesional Imagen enviadaTwitter
Imagen enviadaImagen enviadaImagen enviadaImagen enviada

#3 Alberto Dominguez

Alberto Dominguez

    Gurú

  • Administradores
  • 1.059 Mensajes:
  • LocationMadrid

Escrito 11 marzo 2011 - 19:29

Por aquí dejo una variante con 2500 iteraciones para la sucesión en cada punto:

Imagen enviada

Color:
if (x<0)
  glColor3f(0,color*y*y/15,color*(-x)/25);
else
  glColor3f(color*x/5,color*y*y/15,0);

Saludos,

Alberto Dominguez

Enterprise Architect y Trainer
MCT, MCPD, MCITP, MCITP Dynamics, MCSE, MCSA, MCTS, MCP...
ITIL V3 Foundation Qualification in IT Service Management
Imagen enviadaPerfil Profesional Imagen enviadaTwitter
Imagen enviadaImagen enviadaImagen enviadaImagen enviada

#4 Alberto Dominguez

Alberto Dominguez

    Gurú

  • Administradores
  • 1.059 Mensajes:
  • LocationMadrid

Escrito 11 marzo 2011 - 23:32

Dejo codigo de una versión mejorada, que permite ampliar y reducir pulsando sobre la zona deseada con el raton, con botón izquierdo y botón derecho respectivamente:

#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;
}

Saludos,

Alberto Dominguez

Enterprise Architect y Trainer
MCT, MCPD, MCITP, MCITP Dynamics, MCSE, MCSA, MCTS, MCP...
ITIL V3 Foundation Qualification in IT Service Management
Imagen enviadaPerfil Profesional Imagen enviadaTwitter
Imagen enviadaImagen enviadaImagen enviadaImagen enviada

#5 Alberto Dominguez

Alberto Dominguez

    Gurú

  • Administradores
  • 1.059 Mensajes:
  • LocationMadrid

Escrito 12 marzo 2011 - 01:18

Y algunas imagenes sacadas con él:

Imagen enviada

Imagen enviada

Imagen enviada

Imagen enviada

Imagen enviada
Saludos,

Alberto Dominguez

Enterprise Architect y Trainer
MCT, MCPD, MCITP, MCITP Dynamics, MCSE, MCSA, MCTS, MCP...
ITIL V3 Foundation Qualification in IT Service Management
Imagen enviadaPerfil Profesional Imagen enviadaTwitter
Imagen enviadaImagen enviadaImagen enviadaImagen enviada




0 usuarios están leyendo este tema

0 miembro/s, 0 invitado/s, 0 usuario/s anónimo/s