void readConfigFile ( char *fnme ) { FILE *fptr = fopen ( fnme, "rt" ) ; int i ; char inputline [ 256 ] ; if ( fptr ) { /* Read a header line */ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ; /* Read a comment line */ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ; /* Read the window title */ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ; /* We assume here that this line will not exceed 79 characters plus a newline (window_title is 80 characters long). That'll cause a buffer overflow. For a simple program like this, though, we're letting it slide! */ sscanf ( inputline, "%[a-zA-Z0-9!@#$%^&*()+=/\\_-\" ]", window_title ) ; /* Read a comment line */ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ; /* Read the number of affine transformations */ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ; sscanf ( inputline, "%d", &num_trans ) ; affine = (AffineTrans *)malloc ( num_trans * sizeof(AffineTrans) ) ; /* Read a comment line */ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ; for ( i = 0; i < num_trans; i++ ) { /* Read an affine transformation definition */ checkedFGets ( inputline, sizeof ( inputline ), fptr ) ; sscanf ( inputline, "%lf %lf %lf %lf %lf %lf", &affine[i].a00, &affine[i].a01, &affine[i].a10, &affine[i].a11, &affine[i].b0, &affine[i].b1 ) ; } } else /* No data file, set a default */ { printf ( "ERROR opening file <%s>\n", fnme ) ; strcpy ( window_title, "Koch Snowflake" ) ; num_trans = 4 ; affine = (AffineTrans *)malloc ( num_trans * sizeof(AffineTrans) ) ; affine[0].a00 = 1/3. ; affine[0].a01 = 0.00 ; affine[0].a10 = 0.00 ; affine[0].a11 = 1/3. ; affine[0].b0 = 0.0 ; affine[0].b1 = 0.0 ; affine[1].a00 = 1/6. ; affine[1].a01 = -1/3.*sin(FGH_PI/3.) ; affine[1].a10 = 1/3.*sin(FGH_PI/3.) ; affine[1].a11 = 1/6. ; affine[1].b0 = 1/3. ; affine[1].b1 = 0.0 ; affine[2].a00 = 1/6. ; affine[2].a01 = -1/3.*sin(-FGH_PI/3.) ; affine[2].a10 = 1/3.*sin(-FGH_PI/3.) ; affine[2].a11 = 1/6. ; affine[2].b0 = 0.5 ; affine[2].b1 = sqrt(3)/6. ; affine[3].a00 = 1/3. ; affine[3].a01 = 0.00 ; affine[3].a10 = 0.00 ; affine[3].a11 = 1/3. ; affine[3].b0 = 2/3. ; affine[3].b1 = 0.0 ; } for ( i = 0; i < num_trans; i++ ) { double m00, m01, m10, m11 ; /* Matrix "I" minus "A" */ double determ ; /* Determinant of this matrix */ /* Calculate the stationary point */ m00 = 1.0 - affine[i].a00 ; m01 = - affine[i].a01 ; m10 = - affine[i].a10 ; m11 = 1.0 - affine[i].a11 ; determ = m00 * m11 - m01 * m10 ; if ( fabs ( determ ) > 1.e-6 ) { affine[i].statx = ( m11 * affine[i].b0 - m01 * affine[i].b1 ) / determ ; affine[i].staty = ( -m10 * affine[i].b0 + m00 * affine[i].b1 ) / determ ; } else affine[i].statx = affine[i].staty = 0.0 ; } }
void key_cb ( unsigned char key, int x, int y ) { int i ; char inputline [ INPUT_LINE_LENGTH ] ; switch ( key ) { case 'r' : case 'R' : /* Reset the simulation */ /* Reset the Lorenz parameters */ sigma = s0 ; b = b0 ; r = r0 ; /* Set an initial position */ red_position[0][0] = (double)rand() / (double)RAND_MAX ; red_position[0][1] = (double)rand() / (double)RAND_MAX ; red_position[0][2] = (double)rand() / (double)RAND_MAX ; grn_position[0][0] = (double)rand() / (double)RAND_MAX ; grn_position[0][1] = (double)rand() / (double)RAND_MAX ; grn_position[0][2] = (double)rand() / (double)RAND_MAX ; array_index = 0 ; /* Initialize the arrays */ for ( i = 1; i < NUM_POINTS; i++ ) { memcpy ( red_position[i], red_position[0], 3 * sizeof(double) ) ; memcpy ( grn_position[i], grn_position[0], 3 * sizeof(double) ) ; } break ; case 'm' : case 'M' : /* Modify the Lorenz parameters */ printf ( "Please enter new value for <sigma> (default %f, currently %f): ", s0, sigma ) ; checkedFGets ( inputline, sizeof ( inputline ), stdin ) ; sscanf ( inputline, "%lf", &sigma ) ; printf ( "Please enter new value for <b> (default %f, currently %f): ", b0, b ) ; checkedFGets ( inputline, sizeof ( inputline ), stdin ) ; sscanf ( inputline, "%lf", &b ) ; printf ( "Please enter new value for <r> (default %f, currently %f): ", r0, r ) ; checkedFGets ( inputline, sizeof ( inputline ), stdin ) ; sscanf ( inputline, "%lf", &r ) ; break ; case 's' : case 'S' : /* Stop the animation */ animate = 0 ; break ; case 'g' : case 'G' : /* Start the animation */ animate = 1 ; break ; case ' ' : /* Spacebar: Single step */ animate = 2 ; break ; case 27 : /* Escape key */ glutLeaveMainLoop () ; break ; } }