home *** CD-ROM | disk | FTP | other *** search
/ vis-ftp.cs.umass.edu / vis-ftp.cs.umass.edu.tar / vis-ftp.cs.umass.edu / pub / Software / ASCENDER / ascender.tar.Z / ascender.tar / Triangulate / fbip-io.c < prev    next >
C/C++ Source or Header  |  1995-05-25  |  9KB  |  377 lines

  1. #include <stdio.h>
  2. #include <varargs.h>
  3. #include "fbip.h"
  4.  
  5.  
  6. /*
  7.  * HISTORY
  8.  *
  9.  * 30-Dec-94 Chris McGlone (jcm) at the Digital Mapping Laboratory,
  10.  * School of Computer Science at Carnegie-Mellon University.
  11.  * Installed. Originally supplied by Lynn Quam  (quam@ai.sri.com)
  12.  * for use with classified RADIUS imagery.
  13.  
  14.  * changed 5/24/95 Frank Stolle UMass Amherst 
  15.  * added a flag if we want to print warnings about unrecognized tokens
  16.  *
  17.  */
  18.  
  19. /*
  20. #define WARNINGS_ON 1
  21. */
  22.  
  23. #ifdef NOLISP
  24. void lispprint(s)
  25.      STRING s;
  26. {printf("%s",s);
  27. }
  28. #endif
  29.  
  30. STRING string_copy(s)
  31.   STRING s;
  32. {
  33.   STRING s2;
  34.   int n;
  35.   n = strlen(s);
  36.   if (n == 0) return(0);
  37.   s2 = (STRING ) malloc(n+1);
  38.   strcpy(s2,s);
  39.   return(s2);
  40. }
  41.  
  42. STRING fbip_read_token(st)
  43.   FILE* st;
  44. {
  45.   int how_many;
  46.   static char buffer[1000];
  47.   how_many =  fscanf(st," %s", buffer);
  48.   if (how_many == 0){
  49.     fprintf(stderr, "fbip_read_token failed\n"); 
  50.     return(0);
  51.   }
  52.   /* debprintf("fbip_read_token malloc(%d)\n", strlen(buffer));*/
  53.   if (1)
  54.   {return(string_copy(buffer));}
  55.   else {return(buffer);}
  56. }
  57.  
  58. int fbip_read_list_of_doubles (st, array, n)
  59.   FILE* st;
  60.   double* array;
  61.   int n;
  62. {
  63.   int i, flag;
  64.  
  65.   fscanf(st," (");   
  66.   for (i = 0; i<n; i++){
  67.     flag = fscanf(st,"%lf", &array[i]);
  68.     if (flag == 0) break;
  69.   }
  70.   fscanf(st," )");
  71.   return(i);
  72. }
  73.  
  74. /* ANSI C doesn't define case insensitive string compare. */
  75. /*int strcasecmp(STRING s1, STRING s2)
  76.   {return strcmp(s1,s2);
  77.   }*/
  78.  
  79. #define TokenIs(str) (strcasecmp(token,(str)) == 0)
  80. #define NextTokenIs(str) (strcasecmp((token=fbip_read_token(st)),(str)) == 0)
  81.  
  82. int fbip_read_header (st, fbip)  
  83.   FILE* st;
  84.   FBIP fbip;
  85. {
  86.   int i,j,n; 
  87.   STRING token; 
  88.   static char first_line[100];
  89.   STRING result;
  90.   static double darray[20];
  91.   
  92.   result = fgets(first_line, 100, st);
  93.   if (strcasecmp(result, "RADIUS BLOCK INTERPOLATION PROJECTION\n") != 0){
  94.     fprintf(stderr, "fbip_read_header illegal file header: %s", result);
  95.     return(-1);
  96.   }
  97.  
  98.   initialize_fbip_struct(fbip);
  99.  
  100.   for (i = 0; i <200 ; i++){
  101.     token = fbip_read_token(st);
  102.     
  103.     if TokenIs("IMAGE-ORIGIN")
  104.     {fbip_read_list_of_doubles(st, darray, 20);
  105.      fbip->umin = darray[0];fbip->vmin = darray[1];}
  106.     
  107.     else if TokenIs("BLOCK-SIZE")
  108.     {fbip_read_list_of_doubles(st, darray, 20);
  109.      fbip->du = darray[0];fbip->dv = darray[1];}
  110.     
  111.     else if TokenIs("N-BLOCKS"){
  112.       fbip_read_list_of_doubles(st, darray, 20);
  113.       fbip->blocks_wide = (int)darray[0];fbip->blocks_hi = (int)darray[1];
  114.     }
  115.     
  116.     else if TokenIs("SCALE-FACTOR"){
  117.       fscanf(st, "%lf", &(fbip->scale_factor));
  118.     }
  119.     
  120.     else if TokenIs("HORIZONTAL-UNITS"){
  121.       if NextTokenIs("METERS")
  122.     fbip->horiz_scale_factor = 1.0;
  123.       else if TokenIs("FEET")
  124.     fbip->horiz_scale_factor = 0.3048;
  125.       else
  126.     fprintf(stderr, "Unknown token '%s' for HORIZONTAL-UNITS \n", token);
  127.     }
  128.     
  129.     else if TokenIs("VERTICAL-UNITS"){
  130.       if NextTokenIs("METERS")
  131.     fbip->vert_scale_factor = 1.0;
  132.       else if TokenIs("FEET")
  133.     fbip->vert_scale_factor = 0.3048;
  134.       else
  135.     fprintf(stderr, "Unknown token '%s' for VERTICAL-UNITS \n", token);
  136.     }
  137.     
  138.     else if TokenIs("ELEVATION-LEVELS"){
  139.       n=fbip_read_list_of_doubles(st, darray, 20);
  140.       fbip->z_levels = (double *) malloc(n*sizeof(double));
  141.       fbip->n_levels = n;
  142.       for (j = 0; j<n; j++)
  143.     fbip->z_levels[j] = darray[j];
  144.     }
  145.     
  146.     else if TokenIs("WORLD-COORDINATE-SYSTEM"){
  147.       fbip->lat_long_p = NextTokenIs("LONG-LAT");
  148.     }
  149.     
  150.     else if TokenIs("ORIGIN-LAT-LONG"){
  151.       fbip_read_list_of_doubles(st, darray, 20);
  152.       fbip->xorg = darray[0];fbip->yorg = darray[1];
  153.     }
  154.     
  155.     else if TokenIs("REFERENCE-ELLIPSOID"){
  156.       fbip->ref_ellipsoid = string_copy(fbip_read_token(st));
  157.     }
  158.     
  159.     else if TokenIs("DATA-FORMAT"){
  160.       fbip->binaryp = NextTokenIs("BINARY");
  161.     }
  162.     
  163.     else if TokenIs("BYTE-ORDER"){
  164.       fbip->binendianp = NextTokenIs("BIG-ENDIAN");
  165.     }
  166.     
  167.     else if TokenIs("FLOATING-POINT-FORMAT"){
  168.       fbip->doublep = NextTokenIs("IEEE-64-BIT");
  169.     }
  170.     
  171.     else if TokenIs("HEADER-END"){
  172.       do {} while (getc(st) != '\n');
  173.       break;}
  174.     else 
  175. #ifdef WARNINGS_ON 
  176.       fprintf(stderr, "fbip_read_header Unrecognized token: %s\n", token);
  177. #endif
  178.       ;
  179.   }
  180.   return(1);
  181. }
  182.  
  183. #ifdef JCM
  184. FBIP fbip_read_header_test (pathname)
  185.   STRING pathname;
  186. {
  187.   FILE *st;
  188.   FBIP fbip;
  189.   int  binaryp, binendianp, doublep;
  190.   STRING ref_ellipsoid;
  191.   fbip = (FBIP) malloc(sizeof(struct fbip_struct));
  192.   
  193.   st = fopen("/home/clam1/quam/tmp/xxx.bip2","r");
  194.   fbip_read_header (st, fbip, &binaryp, &binendianp, &doublep, &ref_ellipsoid);
  195.   fclose(st);
  196.   return(fbip);
  197. }
  198.  
  199.  
  200. #endif
  201.  
  202. /* this assumes bigendian byte order */
  203. void read_binary_double_data_bip_file(st, fbip, corners_array)
  204.   FILE* st;
  205.   FBIP fbip; 
  206.   double*** corners_array;
  207. {
  208. #ifdef BOZO
  209.   int ui, vi, level, i;
  210.   double u,v;
  211.   
  212.   /* debprintf("read_binary_double_data_bip_file ... ");
  213.      debprintf("corners array allocated ... ");*/
  214.   for (vi=0, v=fbip->vmin; vi<=fbip->blocks_hi; vi++, v+=fbip->dv)
  215.     for (ui=0, u=fbip->umin; ui<=fbip->blocks_wide; ui++, u+=fbip->du)
  216.     {fread((STRING ) &corners_array[ui][vi][2], sizeof(double), 2* fbip->n_levels, st);
  217.      corners_array[ui][vi][0] = u;
  218.      corners_array[ui][vi][1] = v;
  219.      for (i=2; i<2+2*fbip->n_levels; i+=2)
  220.      {corners_array[ui][vi][i  ] += fbip->xorg;
  221.       corners_array[ui][vi][i+1] += fbip->yorg;
  222.     }
  223.    }
  224.   /* debprintf(" done\n");*/
  225. #endif
  226. }
  227.  
  228.  
  229.  
  230. FBIP read_fbip_file(filename)
  231.   STRING filename;
  232. {
  233.   FILE *st;
  234.   FBIP fbip;
  235.   double ***corners_array;
  236.   
  237.   fbip = (FBIP) malloc(sizeof(struct fbip_struct));
  238.   
  239.   st = fopen(filename,"r");
  240.   
  241.   if (st == 0){
  242.     fprintf(stderr, "Problem opening fbip file '%s' \n", filename);
  243.     return(0);
  244.   }
  245.   
  246.   if (fbip_read_header(st, fbip) == -1){
  247.     fprintf(stderr, "Problem reading fbip file header \n");    
  248.     return(0);
  249.   }
  250.  
  251.   fbip_make_arrays(fbip);
  252.   fbip_compute_height_interpolation_coeffs(fbip);
  253.   
  254.   /* read the corner data */
  255.   corners_array = allocate_corners_array(fbip->blocks_wide, fbip->blocks_hi, fbip->n_levels);
  256.   if (fbip->binaryp) {
  257.     fprintf(stderr,"Sorry--can't read a binary FBIP file \n");
  258.     return;
  259.   }
  260.   else  /* ascii FBIP file */
  261.     read_ascii_data_bip_file(st, fbip, corners_array);
  262.   
  263.   fill_fbip(fbip, corners_array);
  264.   deallocate_corners_array(corners_array, fbip->blocks_wide, fbip->blocks_hi);
  265.   fclose(st);
  266.   
  267.   return(fbip); 
  268. }
  269.  
  270. /*
  271.   CMU additions 
  272.   */
  273.  
  274. int write_ascii_data_bip_file(st, fbip, corners_array)
  275.   FILE* st; 
  276.   FBIP fbip; 
  277.   double*** corners_array;
  278. {
  279.   int ui, vi, i, ii;
  280.   double  *temp;
  281.   
  282.   temp = (double *)calloc(2 * fbip->n_levels, sizeof(double));
  283.   
  284.   for (vi=0; vi<=fbip->blocks_hi; vi++)
  285.     for (ui=0; ui<=fbip->blocks_wide; ui++){
  286.       for (ii = 0, i = 2; i < 2 + 2 * fbip->n_levels; i += 2, ii += 2){
  287.     temp[ii] = corners_array[ui][vi][i  ] - fbip->xorg;
  288.     temp[ii+1] = corners_array[ui][vi][i+1] - fbip->yorg;
  289.     fprintf(st, "%20.5f %20.5f", temp[ii], temp[ii+1]);
  290.       }
  291.       fprintf(st, "\n");
  292.     }
  293.   cfree(temp);
  294. }
  295.  
  296.  
  297. int read_ascii_data_bip_file(st, fbip, corners_array)
  298.   FILE* st;
  299.   FBIP fbip;
  300.   double*** corners_array;
  301. {
  302.   int ui, vi, i;
  303.   double u,v, dum1, dum2;
  304.   
  305.   for (vi = 0, v = fbip->vmin; vi <= fbip->blocks_hi; vi++, v += fbip->dv){
  306.     for (ui = 0, u = fbip->umin; ui <= fbip->blocks_wide; ui++, u += fbip->du){
  307.       corners_array[ui][vi][0] = u;  /* image coordinates */
  308.       corners_array[ui][vi][1] = v;
  309.       for (i = 2; i < 2 + 2 * fbip->n_levels; i += 2){
  310.     fscanf(st, "%lf %lf", &dum1, &dum2);
  311.     corners_array[ui][vi][i  ] = dum1 + fbip->xorg;
  312.     corners_array[ui][vi][i+1] = dum2 + fbip->yorg;
  313.       }
  314.     }
  315.   }
  316. }
  317.  
  318. /****************************
  319.   originally from lispio.c
  320.   ***************************/
  321. /*void lprintf(char *format,  ...)
  322.   {va_list ap;
  323.   char pbuf[1000];
  324.   
  325.   va_start(ap,format);
  326.   vsprintf(pbuf,format,ap); 
  327.   va_end(ap);
  328.   lispprint(pbuf);
  329.   }*/
  330.  
  331.  
  332. int debug_flag = 0;
  333.  
  334. /*void debprintf(char *format,  ...)
  335.   {va_list ap;
  336.   char pbuf[1000];
  337.   if (debug_flag)
  338.   {va_start(ap,format);
  339.   vsprintf(pbuf,format,ap); 
  340.   va_end(ap);
  341.   lispprint(pbuf);
  342.   }
  343.   }
  344.   */
  345. /*
  346.   void errprintf(char *format,  ...)
  347.   {va_list ap;
  348.   char pbuf[1000];
  349.   va_start(ap,format);
  350.   vsprintf(pbuf,format,ap); 
  351.   va_end(ap);
  352.   lispprint(pbuf);
  353.   }
  354.   */
  355. void lispprint(str)
  356.   char *str;
  357. {
  358.   printf("%s", str);
  359. }
  360.  
  361. int initialize_fbip_struct(fbip)
  362.   FBIP fbip;
  363. {
  364.   fbip->ref_ellipsoid = (char *)calloc(256, sizeof(char));
  365.   strcpy(fbip->ref_ellipsoid, "");
  366.   fbip->binaryp = 0;
  367.   fbip->scale_factor = 1.0;
  368.   fbip->horiz_scale_factor = 1.0;
  369.   fbip->vert_scale_factor = 1.0;
  370.   fbip->lat_long_p = 0;
  371.   fbip->binendianp = 1;
  372.   fbip->doublep = 1;
  373.   fbip->xorg = 0.0; fbip->yorg = 0.0; fbip->zorg = 0.0;
  374.   fbip->prev_block_ui=0;
  375.   fbip->prev_block_vi=0;
  376. }
  377.