home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Science / Science.zip / fblnk224.zip / showstar.c < prev    next >
C/C++ Source or Header  |  1999-01-28  |  11KB  |  376 lines

  1. /*  showstar.c  */
  2. /*  part of the fitsblink program  */
  3. /*  Jure Skvarc                    */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7.  
  8. #include <forms.h>
  9. #include <string.h>
  10. #include <fitsio.h>
  11.  
  12. #include "formblink.h"
  13. #include "functs.h"
  14.  
  15. extern STATE state;
  16. extern BLINK_FRAME *frame;
  17. extern CATALOG catalog[];
  18.  
  19. STAR *cstar;
  20.  
  21. void
  22. objstarC(FL_OBJECT *obj, long val)
  23.  
  24. {
  25.   fl_trigger_object(state.showstar->acceptstarW);
  26.   fl_trigger_object(state.showstar->okstarW);
  27. }
  28.  
  29.  
  30. void
  31. draw_object(FL_OBJECT *o, STAR *z, int zoom, FITS_IMAGE *im, BLINK_FRAME *frame, int n)
  32.  
  33. {
  34.   int xq, yq, yt, xt, r;
  35.   int v, h, w;
  36.   int i, j, x, y;
  37.   GC gc = fl_state[fl_get_form_vclass(state.blinker->blinker)].gc[0];
  38.   Window win = FL_ObjWin(o);
  39.  
  40.   x = z->x;
  41.   y = z->y;
  42.   /*  Number of pixels in x and y direction  */
  43.   w = o->w / zoom;
  44.   h = o->h / zoom;
  45.   /*  Do the drawing  */
  46.   yq = o->y;
  47.   yt = y - h / 2;
  48.   for (j = 0; j < h; j++) {
  49.     xq = o->x;
  50.     xt = x - w / 2; 
  51.     for (i = 0; i < w; i++) {
  52.       v = video_point(im, xt++, yt);
  53.       XSetForeground(state.disp, gc, state.pixel[correct(frame, n, v)]);
  54.       XFillRectangle(state.disp, win, gc, xq, yq, zoom, zoom);
  55.       xq += zoom;
  56.     }
  57.     yq += zoom;
  58.     yt++;
  59.   }
  60.   /*  Draw a cross  */
  61.   xt = z->x - w / 2;
  62.   xt = (z->x - (float) xt + 0.5) * zoom + o->x;
  63.   yt = z->y - h / 2;
  64.   yt = (z->y - (float) yt + 0.5) * zoom + o->y;
  65.   w = o->w / 4;
  66.   h = o->h / 4;
  67.   fl_line(xt, o->y, xt, o->y + o->h - 1, FL_RED);
  68.   fl_line(o->x, yt, o->x + o->w - 1, yt, FL_RED);
  69.   if (im->aperture) {
  70.     r = (int) (frame[n].fits.inner * zoom + 0.5);
  71.     fl_ovall(xt - r, yt - r, 2 * r, 2 * r, FL_WHITE);
  72.     fl_ovall(xt - r - 1, yt - r - 1, 2 * (r + 1), 2 * (r + 1), FL_BLACK);
  73.     r = (int) (frame[n].fits.outer * zoom + 0.5);
  74.     fl_ovall(xt - r, yt - r, 2 * r, 2 * r, FL_WHITE);
  75.     fl_ovall(xt - r - 1, yt - r - 1, 2 * (r + 1), 2 * (r + 1), FL_BLACK);
  76.   }
  77. }
  78. /*  Show an object */
  79. int
  80. showstar(BLINK_FRAME *frame, int n, STAR *z, int ok, char *name)
  81.  
  82. {
  83.   double ac, dc;
  84.   char a[25];
  85.   int out, err = 0;
  86.   XEvent event;
  87.   FL_OBJECT *o;
  88.   double xc, yc, xinc, yinc;
  89.  
  90.   int w, h;
  91.   int xq, yq, xt, yt, x, y;
  92.   int zoom;
  93.   int i, j;
  94.   PIXEL v;
  95.   FITS_IMAGE *im;
  96.   Display *disp;
  97.   GC gc = fl_state[fl_get_form_vclass(state.blinker->blinker)].gc[0];
  98.   Window win;
  99.  
  100.   cstar = z;
  101.   xinc = frame[n].map.width / frame[n].map.w;
  102.   yinc = frame[n].map.height / frame[n].map.h;
  103.   xc = 0.5 * frame[n].map.w;
  104.   yc = 0.5 * frame[n].map.h;
  105.   /*  The window in not created yet, do it now  */
  106.   if (state.showstar == NULL) {
  107.     state.showstar = create_form_Star();
  108.     fl_set_object_shortcut(state.showstar->acceptstarW, "^m", 1);
  109.     fl_set_object_shortcut(state.showstar->okstarW, "^m", 1);
  110.   }
  111.   if (ok) {
  112.     fl_hide_object(state.showstar->acceptstarW);
  113.     fl_hide_object(state.showstar->rejectstarW);
  114.     fl_show_object(state.showstar->okstarW);
  115.     fl_deactivate_object(state.showstar->objstarW);
  116.   }
  117.   else {
  118.     fl_show_object(state.showstar->acceptstarW);
  119.     fl_show_object(state.showstar->rejectstarW);
  120.     fl_hide_object(state.showstar->okstarW);
  121.     fl_activate_object(state.showstar->objstarW);
  122.   }
  123.   fl_show_form(state.showstar->Star,  FL_FIX_SIZE, FL_FULLBORDER | FL_PLACE_FREE_CENTER, "Clicked object");
  124.   /*  Write object coordinates in the window  */
  125.   sprintf(a, "x = %.2f", z->x);
  126.   fl_set_object_label(state.showstar->xstarW, a);
  127.   sprintf(a, "y = %.2f", z->y);
  128.   fl_set_object_label(state.showstar->ystarW, a);
  129.   sprintf(a, "v = %.0f", z->mag);
  130.   fl_set_object_label(state.showstar->vstarW, a);
  131.   if (frame[n].matched) {
  132.     sprintf(a, "RA = %s", format_ra(z->ra));
  133.     fl_set_object_label(state.showstar->rastarW, a);
  134.     sprintf(a, "DEC = %s", format_dec(z->dec));
  135.     fl_set_object_label(state.showstar->decstarW, a);
  136.   }
  137.   else if (frame[n].fitsfile.wcs) {
  138.     fits_pix_to_world(z->x + 1, z->y + 1, 
  139.               frame[n].fitsfile.crval1, frame[n].fitsfile.crval2, 
  140.               frame[n].fitsfile.crpix1, frame[n].fitsfile.crpix2, 
  141.               frame[n].fitsfile.cdelt1, frame[n].fitsfile.cdelt2, 
  142.               frame[n].fitsfile.crot,
  143.               frame[n].fitsfile.ctype,
  144.               &ac, &dc, &err);
  145.     sprintf(a, "RA = %s", format_ra(ac));
  146.     fl_set_object_label(state.showstar->rastarW, a);
  147.     sprintf(a, "DEC = %s", format_dec(dc));
  148.     fl_set_object_label(state.showstar->decstarW, a);
  149.   }
  150.   else {
  151.     fl_set_object_label(state.showstar->rastarW, " ");
  152.     fl_set_object_label(state.showstar->decstarW, " ");
  153.   }
  154.   if (name != NULL) {
  155.     fl_set_input(state.showstar->objstarW, name);
  156.   }
  157.   /*  Draw a small subimage centered around the chosen object  */
  158.   /*=====================================================*/
  159.   o = state.showstar->windstarW;
  160.   win = FL_ObjWin(o);
  161.   disp = state.disp;
  162.   x = z->x;
  163.   y = z->y;
  164.   im = &(frame[n].fits);
  165.   /*  Determine number of pixels in x and y direction  */
  166.   zoom = 5;
  167.   w = o->w / zoom;
  168.   h = o->h / zoom;
  169.   /*  Do the drawing  */
  170.   yq = o->y;
  171.   yt = y - h / 2;
  172.   for (j = 0; j < h; j++) {
  173.     xq = o->x;
  174.     xt = x - w / 2; 
  175.     for (i = 0; i < w; i++) {
  176.       v = video_point(im, xt++, yt);
  177.       XSetForeground(disp, gc, state.pixel[correct(frame, n, v)]);
  178.       XFillRectangle(disp, win, gc, xq, yq, zoom, zoom);
  179.       xq += zoom;
  180.     }
  181.     yq += zoom;
  182.     yt++;
  183.   }
  184.   /*  Draw a cross  */
  185.   xt = z->x - w / 2;
  186.   xt = (z->x - xt + 0.5) * zoom + o->x;
  187.   yt = z->y - h / 2;
  188.   yt = (z->y - yt + 0.5) * zoom + o->y;
  189.   w = o->w / 4;
  190.   h = o->h / 4;
  191.   fl_line(xt, o->y, xt, o->y + o->h - 1, FL_RED);
  192.   fl_line(o->x, yt, o->x + o->w - 1, yt, FL_RED);
  193.  
  194.   out = 0;
  195.   fl_deactivate_all_forms();
  196.   fl_activate_form(state.showstar->Star);
  197.   do {
  198.     o = fl_check_forms();
  199.     if (o == FL_EVENT) {
  200.       fl_XNextEvent(&event);
  201.     }
  202.     else if (o == state.showstar->acceptstarW) {
  203.       out = 2;
  204.       strncpy(name, fl_get_input(state.showstar->objstarW), FLEN_VALUE);
  205.     }
  206.     else if (o == state.showstar->rejectstarW) {
  207.       out = 1;
  208.     }
  209.     else if (o == state.showstar->okstarW) {
  210.       out = 3;
  211.     }
  212.   } while(!out);
  213.   fl_hide_form(state.showstar->Star);
  214.   fl_activate_all_forms();
  215.   return out - 1;
  216. }
  217.  
  218.  
  219.  
  220. void
  221. innercircleC(FL_OBJECT *obj, long val)
  222.  
  223. {
  224.   int zoom = 5;
  225.   FL_OBJECT *o;
  226.   int n = state.control[state.control_num];
  227.   char a[20];
  228.  
  229.   frame[n].fits.inner = fl_get_counter_value(obj);
  230.   o = state.showcomet->windcometW;
  231.   fl_set_counter_bounds(state.showcomet->outercircleW, frame[n].fits.inner + 1.0, 50.0);
  232.   cstar->mag = aperture(&frame[n].fits, cstar->x, cstar->y, 
  233.        frame[n].fits.inner, frame[n].fits.outer,
  234.        &cstar->x, &cstar->y);
  235.   draw_object(o, cstar, zoom, &frame[n].fits, frame, n);
  236.   sprintf(a, "x = %.2f", cstar->x);
  237.   fl_set_object_label(state.showcomet->xcometW, a);
  238.   sprintf(a, "y = %.2f", cstar->y);
  239.   fl_set_object_label(state.showcomet->ycometW, a);
  240.   sprintf(a, "v = %.0f", cstar->mag);
  241.   fl_set_object_label(state.showcomet->vcometW, a);
  242. }
  243.  
  244.  
  245. void
  246. outercircleC(FL_OBJECT *obj, long val)
  247.  
  248. {
  249.   int zoom = 5;
  250.   FL_OBJECT *o;
  251.   int n = state.control[state.control_num];
  252.   char a[20];
  253.  
  254.   frame[n].fits.outer = fl_get_counter_value(obj);
  255.   o = state.showcomet->windcometW;
  256.   fl_set_counter_bounds(state.showcomet->innercircleW, 0.1, frame[n].fits.outer - 1.0);
  257.   cstar->mag = aperture(&frame[n].fits, cstar->x, cstar->y, 
  258.        frame[n].fits.inner, frame[n].fits.outer,
  259.        &cstar->x, &cstar->y);
  260.   draw_object(o, cstar, zoom, &frame[n].fits, frame, n);
  261.   sprintf(a, "x = %.2f", cstar->x);
  262.   fl_set_object_label(state.showcomet->xcometW, a);
  263.   sprintf(a, "y = %.2f", cstar->y);
  264.   fl_set_object_label(state.showcomet->ycometW, a);
  265.   sprintf(a, "v = %.0f", cstar->mag);
  266.   fl_set_object_label(state.showcomet->vcometW, a);
  267. }
  268.  
  269. /*  Show an object */
  270. int
  271. showcomet(BLINK_FRAME *frame, int n, STAR *z, int ok, char *name)
  272.  
  273. {
  274.   double ac, dc;
  275.   char a[25];
  276.   int out, err = 0;
  277.   XEvent event;
  278.   FL_OBJECT *o;
  279.   double xc, yc, xinc, yinc;
  280.  
  281.   int zoom = 5;
  282.   FITS_IMAGE *im;
  283.  
  284.   cstar = z;
  285.   xinc = frame[n].map.width / frame[n].map.w;
  286.   yinc = frame[n].map.height / frame[n].map.h;
  287.   xc = 0.5 * frame[n].map.w;
  288.   yc = 0.5 * frame[n].map.h;
  289.   /*  The window in not created yet, do it now  */
  290.   if (state.showcomet == NULL) {
  291.     state.showcomet = create_form_Comet();
  292.     fl_set_object_shortcut(state.showcomet->acceptcometW, "^m", 1);
  293.     fl_set_object_shortcut(state.showcomet->okcometW, "^m", 1);
  294.   }
  295.   if (ok) {
  296.     fl_hide_object(state.showcomet->acceptcometW);
  297.     fl_hide_object(state.showcomet->rejectcometW);
  298.     fl_show_object(state.showcomet->okcometW);
  299.     fl_deactivate_object(state.showcomet->objcometW);
  300.   }
  301.   else {
  302.     fl_show_object(state.showcomet->acceptcometW);
  303.     fl_show_object(state.showcomet->rejectcometW);
  304.     fl_hide_object(state.showcomet->okcometW);
  305.     fl_activate_object(state.showcomet->objcometW);
  306.   }
  307.   fl_set_counter_bounds(state.showcomet->innercircleW, 0.1, frame[n].fits.outer - 1.0);
  308.   fl_set_counter_step(state.showcomet->innercircleW, 0.1, 1);
  309.   fl_set_counter_bounds(state.showcomet->outercircleW, frame[n].fits.inner + 1.0, 15.0);
  310.   fl_set_counter_step(state.showcomet->outercircleW, 0.1, 1);
  311.   fl_set_counter_value(state.showcomet->innercircleW, frame[n].fits.inner);
  312.   fl_set_counter_value(state.showcomet->outercircleW, frame[n].fits.outer);
  313.   fl_show_form(state.showcomet->Comet,  FL_FIX_SIZE, FL_FULLBORDER | FL_PLACE_FREE_CENTER, "Clicked object");
  314.   /*  Write object coordinates in the window  */
  315.   sprintf(a, "x = %.2f", z->x);
  316.   fl_set_object_label(state.showcomet->xcometW, a);
  317.   sprintf(a, "y = %.2f", z->y);
  318.   fl_set_object_label(state.showcomet->ycometW, a);
  319.   sprintf(a, "v = %.0f", z->mag);
  320.   fl_set_object_label(state.showcomet->vcometW, a);
  321.   if (frame[n].matched) {
  322.     sprintf(a, "RA = %s", format_ra(z->ra));
  323.     fl_set_object_label(state.showcomet->racometW, a);
  324.     sprintf(a, "DEC = %s", format_dec(z->dec));
  325.     fl_set_object_label(state.showcomet->deccometW, a);
  326.   }
  327.   else if (frame[n].fitsfile.wcs) {
  328.     fits_pix_to_world(z->x + 1, z->y + 1, 
  329.               frame[n].fitsfile.crval1, frame[n].fitsfile.crval2, 
  330.               frame[n].fitsfile.crpix1, frame[n].fitsfile.crpix2, 
  331.               frame[n].fitsfile.cdelt1, frame[n].fitsfile.cdelt2, 
  332.               frame[n].fitsfile.crot,
  333.               frame[n].fitsfile.ctype,
  334.               &ac, &dc, &err);
  335.     sprintf(a, "RA = %s", format_ra(ac));
  336.     fl_set_object_label(state.showcomet->racometW, a);
  337.     sprintf(a, "DEC = %s", format_dec(dc));
  338.     fl_set_object_label(state.showcomet->deccometW, a);
  339.   }
  340.   else {
  341.     fl_set_object_label(state.showcomet->racometW, " ");
  342.     fl_set_object_label(state.showcomet->deccometW, " ");
  343.   }
  344.   if (name != NULL) {
  345.     fl_set_input(state.showcomet->objcometW, name);
  346.   }
  347.   /*  Draw a small subimage centered around the chosen object  */
  348.   /*=====================================================*/
  349.   o = state.showcomet->windcometW;
  350.   im = &(frame[n].fits);
  351.   draw_object(o, z, zoom, im, frame, n);
  352.   out = 0;
  353.   fl_deactivate_all_forms();
  354.   fl_activate_form(state.showcomet->Comet);
  355.   do {
  356.     o = fl_check_forms();
  357.     if (o == FL_EVENT) {
  358.       fl_XNextEvent(&event);
  359.     }
  360.     else if (o == state.showcomet->acceptcometW) {
  361.       out = 2;
  362.       strncpy(name, fl_get_input(state.showcomet->objcometW), 80);
  363.     }
  364.     else if (o == state.showcomet->rejectcometW) {
  365.       out = 1;
  366.     }
  367.     else if (o == state.showcomet->okcometW) {
  368.       out = 3;
  369.     }
  370.   } while(!out);
  371.   fl_hide_form(state.showcomet->Comet);
  372.   fl_activate_all_forms();
  373.   return out - 1;
  374. }
  375.  
  376.