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.c < prev    next >
C/C++ Source or Header  |  1995-04-13  |  5KB  |  196 lines

  1. /*
  2.  * HISTORY
  3.  *
  4.  * 30-Dec-94 Chris McGlone (jcm) at the Digital Mapping Laboratory,
  5.  * School of Computer Science at Carnegie-Mellon University.
  6.  * Installed. Originally supplied by Lynn Quam  (quam@ai.sri.com)
  7.  * for use with classified RADIUS imagery.
  8.  *
  9.  */
  10.  
  11.  
  12. #include "fbip.h"
  13.  
  14. #define DEBUG_HEIGHT 0
  15.  
  16. COORDINATE *make_coordinate_vector ()
  17. {
  18.   return ((COORDINATE *) malloc(3*sizeof(COORDINATE)));
  19. }
  20.  
  21.  
  22. int fbip_project_in_block (fbip, coeffs, from_position, to_position)
  23.   FBIP fbip;
  24.   double *coeffs;
  25.   COORDINATE *from_position, *to_position;
  26. {
  27.   double x, y, z0, z;
  28.   double **hic;
  29.   int n_levels = fbip->n_levels;
  30.   int level, ci;
  31.   double u, v;
  32.   
  33.   if (to_position == 0) {to_position = make_coordinate_vector();}
  34.   
  35.   x = from_position[0]; y = from_position[1]; z0 = from_position[2];
  36.   z = z0 - fbip->zorg;
  37. /*
  38.   printf("inside block 1 \n");
  39. */
  40.   hic = fbip->height_interpolation_coeffs;
  41.   
  42.   u = 0.0; v = 0.0;
  43.   for (level = 0, ci=0; level<n_levels; level++, ci+=8){
  44.     double coeff, cz, denom, ul, vl;
  45.     int power; double zn;
  46. /* 
  47.     printf("inside block 2 \n");
  48. */
  49.     /* compute u,v for this level by interpolation */
  50.     denom = x*coeffs[ci+6] + y*coeffs[ci+7] + 1.0;
  51.     ul = (x*coeffs[ci  ] + y*coeffs[ci+1] + coeffs[ci+2]) / denom;
  52.     vl = (x*coeffs[ci+3] + y*coeffs[ci+4] + coeffs[ci+5]) / denom;
  53.     
  54.     /* calculate this portion of the height interpolation */
  55.     for (power = 0, zn = 1.0; power < n_levels; power++, zn = zn*z){
  56.       coeff = hic[power][level];
  57.       cz = coeff*zn;
  58.       u += ul*cz;
  59.       v += vl*cz;
  60. /* 
  61.       printf("inside block 3 \n");
  62. */
  63.     }
  64.   }
  65.   
  66.   to_position[0] = u;
  67.   to_position[1] = v;
  68.   return(1);
  69. }
  70.  
  71.  
  72. double *fbip_compute_inverse_block_projective_coeffs_array (coeffs, inv_coeffs, n)
  73.   double *coeffs, *inv_coeffs;
  74.   int n;
  75. {
  76.   double a,b,c,d,e,f,g,h,q;
  77.   int j;
  78.   for (j = 0; j < n; j+=8)
  79.   {a = coeffs[j];
  80.    b = coeffs[j+1];
  81.    c = coeffs[j+2];
  82.    d = coeffs[j+3];
  83.    e = coeffs[j+4];
  84.    f = coeffs[j+5];
  85.    g = coeffs[j+6];
  86.    h = coeffs[j+7];
  87.    q = 1.0 / (b*d - a*e);
  88.    inv_coeffs[j]   = q * (f*h - e);
  89.    inv_coeffs[j+1] = q * (b - c*h);
  90.    inv_coeffs[j+2] = q * (c*e - b*f);
  91.    inv_coeffs[j+3] = q * (d - g*f);
  92.    inv_coeffs[j+4] = q * (c*g - a);
  93.    inv_coeffs[j+5] = q * (a*f - c*d);
  94.    inv_coeffs[j+6] = q * (e*g - d*h);
  95.    inv_coeffs[j+7] = q * (a*h - b*g);
  96.  }
  97.   return(inv_coeffs);
  98. }
  99.  
  100.  
  101. int fbip_project_to_world (fbip, view_position, world_position)
  102.   FBIP fbip;
  103.   COORDINATE *view_position, *world_position;
  104. {
  105.   int ui, vi;
  106.   double *coeffs, *inv_coeffs;
  107.   
  108.   inv_coeffs = fbip->inv_coeffs;
  109.   
  110.   ui = (int) ((view_position[0] - fbip->umin) / fbip->du);
  111.   vi = (int) ((view_position[1] - fbip->vmin) / fbip->dv);
  112.   
  113.   ui = ui<0 ? 0 : (ui>=fbip->blocks_wide ? fbip->blocks_wide-1 : ui);
  114.   vi = vi<0 ? 0 : (vi>=fbip->blocks_hi ? fbip->blocks_hi-1 : vi);
  115.   
  116.   coeffs = fbip->block_projective_coeffs_array[ui][vi];
  117.   inv_coeffs = fbip_compute_inverse_block_projective_coeffs_array(coeffs, inv_coeffs, 
  118.                                   8*fbip->n_levels);
  119.   
  120.   fbip_project_in_block(fbip, inv_coeffs, view_position, world_position);
  121.   
  122.   world_position[0] += fbip->xorg;
  123.   world_position[1] += fbip->yorg;
  124.   world_position[2] = view_position[2];
  125.   
  126.   return (1);
  127. }
  128.  
  129. void fbip_make_arrays (fbip)
  130.   FBIP fbip;
  131. {
  132.   int i,j, ncoeffs, n_levels, blocks_wide, blocks_hi;
  133.   double ***block_projective_coeffs_array;
  134.   double **height_interpolation_coeffs;
  135.   
  136.   blocks_wide = fbip->blocks_wide;
  137.   blocks_hi = fbip->blocks_hi;
  138.   n_levels = fbip->n_levels;
  139.   
  140.   ncoeffs = 8*n_levels;
  141.   block_projective_coeffs_array = (double ***) malloc(blocks_wide * sizeof(double **));
  142.   
  143.   for (i=0; i<blocks_wide; i++)
  144.   {block_projective_coeffs_array[i] = (double **) malloc (blocks_hi * sizeof(double *));
  145.    for (j = 0; j<blocks_hi; j++)
  146.    {block_projective_coeffs_array[i][j] = (double *) malloc (ncoeffs * sizeof(double));
  147.   }}
  148.   fbip->block_projective_coeffs_array = block_projective_coeffs_array;
  149.   
  150.   
  151.   height_interpolation_coeffs = (double **) malloc(n_levels * sizeof(double *));
  152.   for (i = 0; i<n_levels; i++)
  153.   {height_interpolation_coeffs[i] = (double *) malloc(n_levels * sizeof(double));}
  154.   fbip->height_interpolation_coeffs = height_interpolation_coeffs;
  155.   
  156.   
  157.   fbip->inv_coeffs = (double *) malloc(ncoeffs*sizeof(double));
  158. }
  159.  
  160. #ifdef JCM
  161. FBIP make_fbip(blocks_wide, blocks_hi, n_levels,  z_levels)
  162.   int blocks_wide, blocks_hi,  n_levels;
  163.   double *z_levels;
  164. {
  165.   FBIP fbip;
  166.   
  167.   fbip = (FBIP) malloc(sizeof(struct fbip_struct));
  168.   fbip->blocks_wide = blocks_wide;
  169.   fbip->blocks_hi = blocks_hi;
  170.   fbip->n_blocks = blocks_wide * blocks_hi;
  171.   fbip->n_levels = n_levels;
  172.   
  173.   fbip->z_levels = (double *) malloc(n_levels*sizeof(double));
  174.   {int i;
  175.     for (i = 0; i<n_levels; i++)
  176.     {fbip->z_levels[i] = z_levels[i];}
  177.   }
  178.  
  179.   fbip_make_arrays(fbip);
  180.  
  181.   return (fbip);
  182. }
  183.  
  184.  
  185. void repeat_fbip_project_to_view (n, fbip, from, to)
  186.   int n;
  187.   FBIP fbip;
  188.   COORDINATE *from,  *to;
  189. {
  190.   int i;
  191.   for (i = 0; i<n; i++)
  192.   {fbip_project_to_view(fbip, from, to);
  193.  }
  194. }
  195. #endif
  196.