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

  1. #include <stdio.h>
  2. #include "fbip.h"
  3.  
  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.  */
  15.  
  16.  
  17. double block_overlap_slop = .1;  /* pixels */
  18.  
  19. int fbip_point_in_image_block(fbip, vector,  ui,  vi)
  20.   FBIP fbip;
  21.   COORDINATE *vector;
  22.   int ui, vi;
  23. {
  24.   double x, y, ull, vll, slop;
  25.   slop = block_overlap_slop;
  26.   x = vector[0];
  27.   y = vector[1];
  28.   ull = fbip->umin + fbip->du*ui;
  29.   vll = fbip->vmin + fbip->dv*vi;
  30.   return (   (x >= (ull - slop))
  31.       && (x <= (ull + fbip->du + slop))
  32.       && (y >= (vll - slop))
  33.       && (y <= (vll + fbip->dv + slop)));
  34. }
  35.  
  36. typedef enum __fbip_project_to_view_status__ {
  37.   CLIPPED_P_STATUS,
  38.   OK_STATUS
  39.   } fbip_project_to_view_status_code;
  40.  
  41. fbip_project_to_view_status_code
  42.   fbip_extrapolate_block(fbip, view_position, ui2, vi2)
  43. FBIP fbip;
  44. COORDINATE *view_position;
  45. int *ui2, *vi2;
  46. {
  47.   int ui,vi;
  48.   fbip_project_to_view_status_code status;
  49.   ui = (int) ((view_position[0] - fbip->umin) / fbip->du);
  50.   vi = (int) ((view_position[1] - fbip->vmin) / fbip->dv);
  51.   
  52.   status = OK_STATUS;
  53.   if (ui < 0) {ui = 0; status = CLIPPED_P_STATUS;}
  54.   else if (ui >= fbip->blocks_wide) {ui = fbip->blocks_wide-1; status = CLIPPED_P_STATUS;}
  55.   
  56.   if (vi < 0) {vi = 0; status = CLIPPED_P_STATUS;}
  57.   else if (vi >= fbip->blocks_hi) {vi = fbip->blocks_hi-1; status = CLIPPED_P_STATUS;}
  58.   
  59.   *ui2 = ui; *vi2 = vi;
  60.   return(status);
  61. }
  62.  
  63. static COORDINATE tmp_coordinate_vector[3];
  64. int fbip_project_to_view_max_iterations = 10;
  65. BOOLEAN verbose_switch = TRUE;
  66.  
  67. COORDINATE *fbip_project_to_view (fbip, world_position, view_position)
  68.   FBIP fbip;
  69.   COORDINATE *world_position;
  70.   COORDINATE *view_position;
  71. {
  72.   COORDINATE world_vector[3];
  73.   COORDINATE *make_coordinate_vector();
  74.   
  75.   if (view_position == FALSE) view_position = make_coordinate_vector();
  76.   if (world_position == view_position) view_position = tmp_coordinate_vector;
  77.   
  78.   world_vector[0] = world_position[0] - fbip->xorg;
  79.   world_vector[1] = world_position[1] - fbip->yorg;
  80.   world_vector[2] = world_position[2];
  81.   
  82. {
  83.   int i, ui, vi, next_ui, next_vi, status;
  84.   BOOLEAN clipped_p;
  85.   BOOLEAN last_block_on_boundary = FALSE;
  86.   
  87.   ui = fbip->prev_block_ui;
  88.   vi = fbip->prev_block_vi;
  89.  
  90. /*
  91.   printf("checkpoint 1 \n");
  92. */
  93.  
  94.   for (i = 0; i < fbip_project_to_view_max_iterations; i++){
  95.     fbip_project_in_block(fbip, fbip->block_projective_coeffs_array[ui][vi], 
  96.               &world_vector[0], view_position);
  97. /*
  98.     printf("checkpoint 2 \n");
  99. */
  100.     if (fbip_point_in_image_block(fbip, view_position, ui, vi)){
  101.       break;
  102.     }
  103. /*
  104.     printf("checkpoint 3 \n");
  105. */
  106.     status = fbip_extrapolate_block(fbip, view_position, &next_ui, &next_vi);
  107.     clipped_p = (status == CLIPPED_P_STATUS);
  108.    
  109.     if (clipped_p && (! last_block_on_boundary)){
  110.       ui = next_ui; vi = next_vi; last_block_on_boundary = TRUE;
  111.     }
  112.     else if (clipped_p || ((next_ui == ui) && (next_vi == vi))){
  113.       break;
  114.     }
  115.     else {
  116.       ui = next_ui; vi = next_vi;
  117.     }
  118.   }
  119.   
  120.   if (i == fbip_project_to_view_max_iterations){
  121.     fprintf (stderr, "FBIP-PROJECT-TO-VIEW failed to converge after ~%d iterations.\n", 
  122.          fbip_project_to_view_max_iterations);
  123.   }
  124.   
  125.   fbip->prev_block_ui = ui;
  126.   fbip->prev_block_vi = vi;
  127.   
  128.   if (view_position == tmp_coordinate_vector){
  129.     world_position[0] = view_position[0];
  130.     world_position[1] = view_position[1];
  131.     return(world_position);
  132.   }
  133.   
  134.   else {
  135.     view_position[2] = world_position[2];
  136.     return(view_position);
  137.   }
  138. }}
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.