#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