include include include "wcslab.h" include "wcs_desc.h" # WL_GRID -- Put the grid lines/tick marks on the plot. # # Description # Based on previously determined parameters., draw the grid lines and/or # tick marks onto the graph. While in the process of doing this, create # a list of possible label points for use by the label_grid routine. procedure wl_grid (wd) pointer wd # I: the WCSLAB descriptor double current, tmp_begin, tmp_end, tmp_minor_interval int old_type, old_n_labels, min_counter int gstati() begin # Initialize the label counter. WL_N_LABELS(wd) = 0 # Remember what line type is currently active. old_type = gstati (WL_GP(wd), G_PLTYPE) # Determine integer range for axis 1. tmp_minor_interval = WL_MAJOR_INTERVAL(wd,AXIS1) / double (WL_MINOR_INTERVAL(wd,AXIS1)) # If near-polar, the lines should go all the way to the poles. if (WL_GRAPH_TYPE(wd) == NEAR_POLAR) if (abs (WL_BEGIN(wd,AXIS2)) < abs (WL_END(wd,AXIS2))) { tmp_begin = WL_BEGIN(wd,AXIS2) tmp_end = NORTH_POLE_LATITUDE } else { tmp_begin = SOUTH_POLE_LATITUDE tmp_end = WL_END(wd,AXIS2) } else { tmp_begin = WL_BEGIN(wd,AXIS2) tmp_end = WL_END(wd,AXIS2) } # Plot lines of constant value in axis 1. current = WL_BEGIN(wd,AXIS1) min_counter = 0 repeat { if (mod (min_counter, WL_MINOR_INTERVAL(wd,AXIS1)) == 0) { call gseti (WL_GP(wd), G_PLTYPE, WL_MAJ_LINE_TYPE(wd)) call wl_graph_constant_axis1 (wd, current, tmp_begin, tmp_end, WL_MAJ_GRIDON(wd), WL_LABON(wd), WL_MAJ_TICK_SIZE(wd)) } else { call gseti (WL_GP(wd), G_PLTYPE, WL_MIN_LINE_TYPE(wd)) call wl_graph_constant_axis1 (wd, current, tmp_begin, tmp_end, WL_MIN_GRIDON(wd), NO, WL_MIN_TICK_SIZE(wd)) } min_counter = min_counter + 1 current = WL_BEGIN(wd,AXIS1) + tmp_minor_interval * min_counter } until (real (current) > real (WL_END(wd,AXIS1))) # Determine the interval range for the second axis. tmp_minor_interval = WL_MAJOR_INTERVAL(wd,AXIS2) / double (WL_MINOR_INTERVAL(wd,AXIS2)) # Plot lines of constant value in axis 2. if (WL_END(wd,AXIS2) < WL_BEGIN(wd,AXIS2)) { current = WL_END(wd,AXIS2) tmp_minor_interval = -tmp_minor_interval tmp_end = WL_BEGIN(wd,AXIS2) } else { current = WL_BEGIN(wd,AXIS2) tmp_end = WL_END(wd,AXIS2) } min_counter = 0 tmp_begin = current repeat { if (mod (min_counter, WL_MINOR_INTERVAL(wd,AXIS2)) == 0) { call gseti (WL_GP(wd), G_PLTYPE, WL_MAJ_LINE_TYPE(wd)) old_n_labels = WL_N_LABELS(wd) call wl_graph_constant_axis2 (wd, current, WL_BEGIN(wd,AXIS1), WL_END(wd,AXIS1), WL_MAJ_GRIDON(wd), WL_LABON(wd), WL_MAJ_TICK_SIZE(wd)) # If this is a polar or near_polar plot, the latitudes # should be placed near the line, not where it crosses the # window boundary. if (WL_GRAPH_TYPE(wd) == POLAR && (WL_MAJ_GRIDON(wd) == YES) && (WL_LABON(wd) == YES)) { WL_N_LABELS(wd) = old_n_labels + 1 call wl_w2ld (WL_WLCT(wd), WL_AXIS_FLIP(wd), WL_POLAR_LABEL_POSITION(wd), current, WL_LABEL_POSITION(wd,WL_N_LABELS(wd),X_DIM), WL_LABEL_POSITION(wd,WL_N_LABELS(wd),Y_DIM), 1) WL_LABEL_VALUE(wd,WL_N_LABELS(wd)) = current WL_LABEL_AXIS(wd,WL_N_LABELS(wd)) = AXIS2 } } else { call gseti (WL_GP(wd), G_PLTYPE, WL_MIN_LINE_TYPE(wd)) call wl_graph_constant_axis2 (wd, current, WL_BEGIN(wd,AXIS1), WL_END(wd,AXIS1), WL_MIN_GRIDON(wd), NO, WL_MIN_TICK_SIZE(wd)) } # Increment and continue min_counter = min_counter + 1 current = tmp_begin + tmp_minor_interval * min_counter } until (real (current) > real (tmp_end)) # Set the line type back to the way it was. call gseti (WL_GP(wd), G_PLTYPE, old_type) end # WL_GRAPH_CONSTANT_AXIS1 - Graph lines of constant X-axis values. # # Description # Because projections are rarely linear, the basic GIO interface to draw # lines cannot be used. Instead, this routine handles the line drawing. # Also, possible label points are found and added to a label list array. # # CLUDGE! Finding labels here is WRONG. Ideally, crossing points (where the # line crosses a screen boundary) should be determined analytically. However, # the MWCS interface lacks the required "cross-transformations". It can # still be done, but requires a total bypassing of MWCS. Instead, this # simplistic approach is used. procedure wl_graph_constant_axis1 (wd, x, ymin, ymax, gridon, label, tick_size) pointer wd # I: the WCSLAB descriptor double x # I: X value to hold constant double ymin, ymax # I: Y values to vary between int gridon # I: true if gridding is on int label # I: true if the points should be labelled real tick_size # I: size of tick marks bool done double lastx, lasty, lx, ly, y, yinc real rlx, rly begin # Determine the scale at which Y should be incremented. yinc = (ymax - ymin) / WL_LINE_SEGMENTS(wd) # Now graph the line segments. y = ymin call wl_w2ld (WL_WLCT(wd), WL_AXIS_FLIP(wd), x, y, lastx, lasty, 1) rlx = lastx rly = lasty call gamove (WL_GP(wd), rlx, rly) repeat { call wl_w2ld (WL_WLCT(wd), WL_AXIS_FLIP(wd), x, y, lx, ly, 1) call wl_point_to_label (wd, lastx, lasty, lx, ly, AXIS1, x, gridon, label, tick_size) if (gridon == YES) { rlx = lx rly = ly call gadraw (WL_GP(wd), rlx, rly) } if (yinc < 0.) done = y < ymax else done = y > ymax y = y + yinc lastx = lx lasty = ly } until (done) end # WL_GRAPH_CONSTANT_AXIS2 -- Graph lines of constant Y-axis values. # # Description # Because projections are rarely linear, the basic GIO interface to draw # lines cannot be used. Instead, this routine handles the line drawing. # Also, possible label points are found and added to an label list array. # # CLUDGE! Finding labels here is WRONG. Ideally, crossing points (where the # line crosses a screen boundary) should be determined analytically. However, # the MWCS interface lacks the required "cross-transformations". It can # still be done, but requires a total bypassing of MWCS. Instead, this # simplistic approach is used. procedure wl_graph_constant_axis2 (wd, y, xmin, xmax, gridon, label, tick_size) pointer wd # I: the WCSLAB descriptor double y # I: Y value to hold constant double xmin, xmax # I: X values to vary between int gridon # I: true if gridding is on int label # I: true if points should be labelled real tick_size # I: tick mark size bool done double lx, ly, lastx, lasty, x, xinc real rlx, rly begin # Determine the scale at which X should be incremented. xinc = (xmax - xmin) / WL_LINE_SEGMENTS(wd) # Now graph the line segments. x = xmin call wl_w2ld (WL_WLCT(wd), WL_AXIS_FLIP(wd), x, y, lastx, lasty, 1) rlx = lastx rly = lasty call gamove (WL_GP(wd), rlx, rly) repeat { call wl_w2ld (WL_WLCT(wd), WL_AXIS_FLIP(wd), x, y, lx, ly, 1) call wl_point_to_label (wd, lastx, lasty, lx, ly, AXIS2, y, gridon, label, tick_size) if (gridon == YES) { rlx = lx rly = ly call gadraw (WL_GP(wd), rlx, rly) } if (xinc < 0.) done = x < xmax else done = x > xmax lastx = lx lasty = ly x = x + xinc } until (done) end # Define the inside and outside of the window. define OUT (($1<=WL_SCREEN_BOUNDARY(wd,LEFT))||($1>=WL_SCREEN_BOUNDARY(wd,RIGHT))||($2<=WL_SCREEN_BOUNDARY(wd,BOTTOM))||($2>=WL_SCREEN_BOUNDARY(wd,TOP))) define IN (($1>WL_SCREEN_BOUNDARY(wd,LEFT))&&($1WL_SCREEN_BOUNDARY(wd,BOTTOM))&&($2