#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.005; static double K = 0.1; void NonlinearMap(double *x, double *y){ /* Standard Map */ *y += K * sin(*x); *x += *y; /* Angle x is modules 2Pi */ *x = fmod(*x, pi2); if (*x < 0.0) *x += pi2; }; /* Callback function: What to do in absence of use input */ void idle(void){ /* Increase the stochastic parameter */ K += Delta_K; if(K > K_max) K = K_min; /* Redraw the display */ glutPostRedisplay(); }; /* Initialization for the graphics window */ void winInit(void){ gluOrtho2D(0.0, pi2, 0.0, pi2); }; /* Callback function: What to do when the display needs redrawing */ 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); glBegin(GL_POINTS); for (orbit = 0; orbit < NumberOrbits; orbit++){ double x, y; y = 3.1415; x = Delta_x * orbit; for (step = 0; step < NumberSteps; step++){ NonlinearMap(&x, &y); glVertex2f(x, y); }; }; for (orbit = 0; orbit < NumberOrbits; orbit++){ double x, y; x = 3.1415; y = Delta_x * orbit; for (step = 0; step < NumberSteps; step++){ NonlinearMap(&x, &y); glVertex2f(x, y); }; }; glEnd(); glutSwapBuffers(); }; int main(int argc, char **argv) { /* GLUT Initializations */ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(5,5); glutInitWindowSize(300,300); /* Open Window */ glutCreateWindow("Order to Chaos"); /* Window initializations */ winInit(); /* Register callback functions */ glutDisplayFunc(display); glutIdleFunc(idle); /* Launch event processing */ glutMainLoop(); return 0; }