1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <mach.h>
include <gset.h>
include <gio.h>
include "glabax.h"
# GLABAX -- Draw and label the axes of the plot (normally the viewport
# boundary). This is done in two steps. First we compute all the required
# parameters, and then we draw and label the axes. Up to four axes can be
# drawn. To simplify matters, all four axes are treated equally and
# independently. The axes are drawn a tick at a time in world coordinates.
procedure glabax (gp, title, xlabel, ylabel)
pointer gp # graphics descriptor
char title[ARB] # plot title (may be more than one line)
char xlabel[ARB] # X axis label
char ylabel[ARB] # Y axis label
char label[SZ_LABEL]
int axis, wcs, ntitlelines, ip, major_tick
int save_plcolor, save_txcolor, save_facolor
int save_pltype, save_clip, save_txfont
real xv[4], yv[4], x1, x2, y1, y2
real save_plwidth, save_txsize
real dx, dy, x, y, sx, sy, scalar, wc, wstep
pointer sp, axes[4], ax, w
real gstatr()
bool ttygetb()
int gstati(), glb_gettick()
errchk glb_setup, gadraw, grdraw, gamove, gtext
errchk glb_label_axis, glb_plot_title, glb_gettick
begin
call smark (sp)
call salloc (axes[1], LEN_AX, TY_STRUCT)
call salloc (axes[2], LEN_AX, TY_STRUCT)
call salloc (axes[3], LEN_AX, TY_STRUCT)
call salloc (axes[4], LEN_AX, TY_STRUCT)
wcs = GP_WCS(gp)
w = GP_WCSPTR(gp,wcs)
# Count the number of lines in the title block.
ntitlelines = 0
if (title[1] != EOS) {
for (ip=1; title[ip] != EOS; ip=ip+1)
if (title[ip] == '\n' && title[ip+1] != EOS)
ntitlelines = ntitlelines + 1
ntitlelines = ntitlelines + 1
}
ntitlelines = max (ntitlelines, GP_NTITLELINES(gp))
# Fix the coordinates systems and set the axis drawing parameters.
# The number of lines in the title block is needed to determine how
# much space to allow at the top of the screen.
call glb_setup (gp, axes, ntitlelines, xlabel, ylabel)
# Save the values of any user parameters we must change while drawing
# the axes.
save_pltype = gstati (gp, G_PLTYPE)
save_plwidth = gstatr (gp, G_PLWIDTH)
save_plcolor = gstati (gp, G_PLCOLOR)
save_txfont = gstati (gp, G_TXFONT)
save_txsize = gstatr (gp, G_TXSIZE)
save_txcolor = gstati (gp, G_TXCOLOR)
save_facolor = gstati (gp, G_FACOLOR)
save_clip = WCS_CLIP(w)
# Prepare the background.
if (ttygetb (GP_TTY(gp), "fa") &&
GP_FRAMECOLOR(gp) != 0 && GP_FRAMEDRAWN(gp) == NO) {
call ggview (gp, x1, x2, y1, y2)
call gseti (gp, G_WCS, 0)
call gseti (gp, G_CLIP, NO)
xv[1] = 0.0; yv[1] = 0.0
xv[2] = 1.0; yv[2] = 0.0
xv[3] = 1.0; yv[3] = 1.0
xv[4] = 0.0; yv[4] = 1.0
call gseti (gp, G_FACOLOR, GP_FRAMECOLOR(gp))
call gfill (gp, xv, yv, 4, GF_SOLID)
xv[1] = x1; yv[1] = y1
xv[2] = x2; yv[2] = y1
xv[3] = x2; yv[3] = y2
xv[4] = x1; yv[4] = y2
call gseti (gp, G_FACOLOR, 0)
call gfill (gp, xv, yv, 4, GF_SOLID)
call gseti (gp, G_CLIP, save_clip)
call gseti (gp, G_WCS, wcs)
GP_FRAMEDRAWN(gp) = YES
}
# Draw and label the four axes. First set the linetype and linewidth
# to be used to draw the axes and ticks; these may be different than
# that used to plot the data. Draws are preferred to moves to minimize
# the number of polylines needed to draw the axis. An axis is drawn
# by moving to the start of the axis, drawing each tick in sequence,
# and then moving to the end of the axis. Tick labels are drawn at
# the major ticks if required. The axes and ticks must be drawn in
# world coords to get the proper scaling. Clipping is turned off while
# drawing the axes to avoid clipping portions of the axes due to small
# floating point errors.
call gseti (gp, G_PLTYPE, 1)
call gseti (gp, G_CLIP, NO)
call gseti (gp, G_TXFONT, GT_BOLD)
do axis = 1, 4 {
ax = axes[axis]
if (AX_DRAWME(ax) == NO)
next
# call eprintf ("axis %d: tick1=(%g,%g) istep=(%g,%g) kstep=%g\n")
# call pargi (axis)
# call pargr (AX_TICK1(ax,1)); call pargr (AX_TICK1(ax,2))
# call pargr (AX_ISTEP(ax,1)); call pargr (AX_ISTEP(ax,2))
# call pargr (AX_IKSTEP(ax))
# call eprintf ("\tstart=(%g,%g) end=(%g,%g)\n")
# call pargr (AX_START(ax,1)); call pargr (AX_START(ax,2))
# call pargr (AX_END(ax,1)); call pargr (AX_END(ax,2))
# call eprintf ("nminor=%d, inleft=%d, minortick=(%g,%g), majortick=(%g,%g)\n")
# call pargi (AX_NMINOR(ax)); call pargi (AX_INLEFT(ax))
# call pargr (AX_MINORTICK(ax,1)); call pargr (AX_MINORTICK(ax,2))
# call pargr (AX_MAJORTICK(ax,1)); call pargr (AX_MAJORTICK(ax,2))
# Set the axis linewidth and move to the start of the axis.
call gsetr (gp, G_PLWIDTH, AX_AXISWIDTH(ax))
call gseti (gp, G_PLCOLOR, AX_AXISCOLOR(ax))
call gamove (gp, AX_START(ax,1), AX_START(ax,2))
# Draw the axis and label the major ticks if so indicated.
# First set flag to initialize glb_gettick.
AX_NLEFT(ax) = -1
while (glb_gettick (gp, ax, x, y, major_tick) != EOF) {
# Advance to the next tick.
call gsetr (gp, G_PLWIDTH, AX_AXISWIDTH(ax))
call gseti (gp, G_PLCOLOR, AX_AXISCOLOR(ax))
call gadraw (gp, x, y)
if (major_tick == YES) {
# Draw a major tick.
call gsetr (gp, G_PLWIDTH, AX_MAJORWIDTH(ax))
call gseti (gp, G_PLCOLOR, AX_TICKCOLOR(ax))
dx = AX_MAJORTICK(ax,1)
dy = AX_MAJORTICK(ax,2)
call grdraw (gp, dx, dy)
call grdraw (gp, -dx, -dy)
if (AX_LABELTICKS(ax) == YES) {
# Get the tick label position in NDC coords. World
# coords cannot be used for an offset outside the
# viewport as the coords might be indefinite if log
# scaling.
call gseti (gp, G_WCS, 0)
call gcurpos (gp, sx, sy)
dx = AX_TICKLABELOFFSET(ax,1)
dy = AX_TICKLABELOFFSET(ax,2)
# Format the numeric tick label string. The scalar
# multiplier is used to compute the step size between
# major ticks.
scalar = AX_NMINOR(ax) + 1.0
if (AX_HORIZONTAL(ax) == YES) {
wc = x
wstep = AX_STEP(ax,1) * scalar
} else {
wc = y
wstep = AX_STEP(ax,2) * scalar
}
# Draw the label string.
call gsetr (gp, G_TXSIZE, AX_TICKLABELSIZE(ax))
call gseti (gp, G_TXCOLOR, AX_TICKLABELCOLOR(ax))
# If log scaling, label the ticks in log units.
if (AX_SCALING(ax) == LINEAR) {
call glb_encode (wc, label, SZ_LABEL,
AX_TICKFORMAT(ax), wstep)
call gtext (gp, sx + dx, sy + dy, label,
AX_TICKLABELPOS(ax))
} else {
call glb_loglab (gp, sx+dx, sy+dy, wc,
AX_TICKLABELPOS(ax), AX_SCALING(ax))
}
# Leave the pen back at the base of the tick.
call gamove (gp, sx, sy)
call gseti (gp, G_WCS, wcs)
}
} else {
# Draw a minor tick.
dx = AX_MINORTICK(ax,1)
dy = AX_MINORTICK(ax,2)
call gsetr (gp, G_PLWIDTH, AX_MINORWIDTH(ax))
call gseti (gp, G_PLCOLOR, AX_TICKCOLOR(ax))
call grdraw (gp, dx, dy)
call grdraw (gp, -dx, -dy)
}
}
# Draw line segment from last tick to the end of the axis.
call gadraw (gp, AX_END(ax,1), AX_END(ax,2))
# Flush the graphics output. When working interactively, this
# gives the user something to watch while we generate the rest
# of the plot.
if (AX_NMINOR(ax) > 0)
call gflush (gp)
}
# Draw grid between major ticks.
if (GL_DRAWGRID (GP_XAP(gp)) == YES) {
call gseti (gp, G_PLCOLOR, AX_GRIDCOLOR(axes[3]))
call glb_drawgrid (gp, axes[3], axes[2])
}
if (GL_DRAWGRID (GP_YAP(gp)) == YES) {
call gseti (gp, G_PLCOLOR, AX_GRIDCOLOR(axes[1]))
call glb_drawgrid (gp, axes[1], axes[4])
}
# Label the X and Y axes.
do axis = 1, 4 {
ax = axes[axis]
if (AX_DRAWME(ax) == YES && AX_LABELTICKS(ax) == YES) {
call gseti (gp, G_TXCOLOR, AX_AXISLABELCOLOR(ax))
call glb_label_axis (gp, ax, xlabel, ylabel)
}
}
# Draw plot title block.
call gseti (gp, G_TXCOLOR, GP_TITLECOLOR(gp))
call glb_plot_title (gp, title, ntitlelines)
# Restore the parameters we were originally called with.
call gseti (gp, G_WCS, wcs)
call gseti (gp, G_CLIP, save_clip)
call gseti (gp, G_PLTYPE, save_pltype)
call gsetr (gp, G_PLWIDTH, save_plwidth)
call gseti (gp, G_PLCOLOR, save_plcolor)
call gsetr (gp, G_TXSIZE, save_txsize)
call gseti (gp, G_TXFONT, save_txfont)
call gseti (gp, G_TXCOLOR, save_txcolor)
call gseti (gp, G_FACOLOR, save_facolor)
call gflush (gp)
call sfree (sp)
end
|