Programa openGL con ventana en doble buffer


#include <GL/glut.h> 
#include <math.h>



const  double  pi2 = 6.28318530718; 
const  double  K_max = 3.5;
const  double  K_min = 0.1;
static double  Delta_K = 0.01;
static double  K = 0.1;          



void NonlinearMap(double *x, double *y){
    /* Transformación estandar */
    *y += K * sin(*x);
    *x += *y;
    /* El ángulo x es módulo 2Pi */
    *x = fmod(*x, pi2);
    if (*x < 0.0) *x += pi2;

};




/* Función callback: 
   Qué hacer en ausencia de entradas */
void  idle(void){
    /* Incrementar el parámetro estocástico */
    K += Delta_K;
    if(K > K_max) K = K_min;



    /* Redibujar el display */
    glutPostRedisplay();

};





/* Inicialización de la ventana gráfica */
void winInit(void){
    gluOrtho2D(0.0, pi2, 0.0, pi2);

};


/* Función callback:
    Qué hacer cuando el display se ha de redibujar */
void display(void){
    const int    NumberSteps = 1000;
    const int    NumberOrbits = 50;
    const double Delta_x = pi2/(NumberOrbits-1);
    int step, orbit;



    glColor3f(0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);



    for (orbit = 0; orbit < NumberOrbits; orbit++){
double x, y;
y = 3.1415;
x = Delta_x * orbit;
glBegin(GL_POINTS);
for (step = 0; step < NumberSteps; step++){
 NonlinearMap(&x, &y);
     glVertex2f(x, y);

};

glEnd();

     };



     for (orbit = 0; orbit < NumberOrbits; orbit++){
double x, y;
x = 3.1415;
y = Delta_x * orbit;
        glBegin(GL_POINTS);
for (step = 0; step < NumberSteps; step++){
 NonlinearMap(&x, &y);
 glVertex2f(x, y);

};

glEnd();

     };
     glutSwapBuffers();
};





int main(int argc, char **argv)  {  
  /* Inicializaciones de GLUT */
  glutInit(&argc, argv);  
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);  
  glutInitWindowPosition(5,5);  
  glutInitWindowSize(300,300);
  /* Abrir ventana*/
  glutCreateWindow("Order to Chaos");  
  /* Inicialización de la ventana */
  winInit();
  /* Registrar funciones callback */
  glutDisplayFunc(display);  
  glutIdleFunc(idle);
  /* Iniciar el proceso de eventos */
  glutMainLoop();  

  return 0;  

}  






No hay comentarios:

Publicar un comentario