// t42.c
// v0.1 KHL 2009-04-21
// gcc -o t42 t42.c -lm -lgd ; ./t42
// static drawing, though slow to compute
// earth and toroid around orbit

#define TITLE    ""
#define GIFOUT   "t42.gif"
#define RADIUS   500.00
#define SQUARE    10.00
#define SCALE    0.5

#include "tor00.hc"


// oregon data -----------------

int     orpoint         ;
double  orscale         ;
double  orcentx, orcenty ;  // oregon center
double  orx[3000]       ;  // point array for oregon overlay
double  ory[3000]       ;  // point array for oregon overlay
gdPoint ors[3000]       ;  // scaled point array for oregon overlay

FILE    *orfile;                            // oregon outline data file


// read in oregon outline data ---------------------

#define  OR_FILE     "OR.xy"
#define  ORWIDE       645.0                 // Oregon width for scaling data
 
FILE    *orfile;                            // oregon outline data file

// ------------------------------------------------------------------------

void or_readin() {
   double  orx1, ory1   ;
   double  orxmin= 1000.0 ;
   double  orxmax=-1000.0 ;
   double  orymin= 1000.0 ;
   double  orymax=-1000.0 ;
   int     orcnt;

   orfile  = fopen( OR_FILE, "r" );
   orpoint = 0 ;
   while( EOF != fscanf( orfile, "%lf%lf\n", &orx1, &ory1 ) ) {
      orx[orpoint] = orx1 ;
      ory[orpoint] = ory1 ;
      orpoint++ ;
      if ( orxmin > orx1 ) { orxmin = orx1 ; } 
      if ( orxmax < orx1 ) { orxmax = orx1 ; } 
      if ( orymin > ory1 ) { orymin = ory1 ; } 
      if ( orymax < ory1 ) { orymax = ory1 ; } 
   }
   orscale =  ORWIDE / ( orxmax - orxmin ) ;     // kilometers per input point
   orcentx = ( orxmin + orxmax ) / 2.0 ;
   orcenty = ( orymin + orymax ) / 2.0 ;
   
   // scale and normalize data to kilometers
   for( orcnt = 0; orcnt<orpoint ; orcnt++ ) {
      orx[orcnt] = orscale*( orx[orcnt] - orcentx );
      ory[orcnt] = orscale*( ory[orcnt] - orcenty );
   }
   fclose( orfile );
}

// draw oregon outline  ---------------------

void draworegon( int xcent, int ycent, double scale ) {

   int     orcnt ;

   for( orcnt = 0 ; orcnt < orpoint ; orcnt++ ) {
      ors[orcnt].x = xcent + scale*orx[orcnt]  ;
      ors[orcnt].y = ycent - scale*ory[orcnt]  ;
      printf( "%5d%8d%8d%9.3f%9.3f\n",
         orcnt, ors[orcnt].x, ors[orcnt].y, orx[orcnt], ory[orcnt] ) ;
   }
   gdImageFilledPolygon( im, ors, orpoint, green ) ;
}

// ------------------------------------------------------------------------

int main () {
   int     diam = (int) ( 2.0 * SCALE * RADIUS );
   double  rmax = (RADIUS/SQUARE)-0.51 ;
   int     ymax = (int) rmax ;
   int     xmax   ;
   int     delta = (int) ( SCALE * SQUARE + 0.001 );
   int     sq    = (delta / 2) - 1 ;
   int     num = 0 ;
   int     xp, yp ;
   int     ycent = YCENTER - 25 ;
   int     xcent = XCENTER ;
   double  scale = SCALE   ;                // pixels per kilometer

   or_readin();

   displaystart();
   torstart();
   gdImageGifAnimBegin( im1, gifout, 1, -1 ) ; // no repeat
   // gdImageGifAnimBegin( im1, gifout, 1,  4 ) ; // repeat 4 times
   // gdImageGifAnimBegin( im1, gifout, 1,  0 ) ; // continuous repeat
   framestart(    90, TITLE );

   gdImageFilledEllipse( im, xcent, ycent, diam, diam, white );

   for( yp = -ymax ; yp <= ymax ; yp++ ) {
      xmax = (int) sqrt( rmax*rmax - (double) (yp*yp) );
      int y = yp*delta + ycent ;
      for( xp = -xmax ; xp <= xmax ; xp++ ) { 
         int x = xp*delta + xcent ;
         num++ ;
         gdImageFilledRectangle( im, x-sq, y-sq, x+sq, y+sq, black );
      }
   }
   draworegon ( xcent, ycent, scale );

   sprintf( bottom, "" );

   frameend();
   displayend();
   return 0;
}
