Ejemplo n.º 1
0
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 ;
  }
}
Ejemplo n.º 2
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 ;
  }
}