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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <mach.h>
include <gset.h>
define SZ_LABEL 10
define SZ_FMT 20
# DRAW_PERIMETER -- draw and annotate the axes drawn around the perimeter
# of the image pixels. The viewport and window have been set by
# the calling procedure. Plotting is done in window coordinates.
# This procedure is called by both crtpict and the ncar plotting routines
# contour and hafton.
procedure draw_perimeter (gp)
pointer gp # Graphics descriptor
real xs, xe, ys, ye # WCS coordinates of pixel window
int i, first_col, last_col, first_tick, last_tick, bias
int nchar, dummy, first_row, last_row, cnt_step, cnt_label
char label[SZ_LABEL], fmt1[SZ_FMT], fmt2[SZ_FMT], fmt3[SZ_FMT], fmt4[SZ_FMT]
real dist, kk, col, row, dx, dy, sz_char, cw, xsz, label_pos
real xdist, ydist, xspace, yspace
bool ggetb()
int itoc()
real ggetr()
real k[3]
data k/1.0,2.0,3.0/
errchk ggwind, gseti, gctran, gline, gtext, itoc
begin
# First, get window coordinates and turn off clipping
call ggwind (gp, xs, xe, ys, ye)
call gseti (gp, G_CLIP, NO)
# A readable character width seems to be about 1.mm. A readable
# perimeter seperation seems to be about .80mm. If the physical
# size of the output device is contained in the graphcap file, the
# NDC sizes of these measurements can be determined. If not,
# the separation between perimeter axes equals one quarter character
# width or one quarter percent of frame, which ever is larger, and
# the character size is set to 0.40.
cw = max (ggetr (gp, "cw"), 0.01)
if (ggetb (gp, "xs")) {
xsz = ggetr (gp, "xs")
dist = .80 / (xsz * 1000.)
sz_char = dist / cw
} else {
# Get character width and calculate perimeter separation.
dist = cw * 0.25
sz_char = 0.40
}
# Convert distance to user coordinates
call ggscale (gp, xs, ys, dx, dy)
xdist = dist * dx
ydist = dist * dy
# Generate four possible format strings for gtext
call sprintf (fmt1, SZ_LINE, "h=c;v=t;s=%.2f")
call pargr (sz_char)
call sprintf (fmt2, SZ_LINE, "h=c;v=b;s=%.2f")
call pargr (sz_char)
call sprintf (fmt3, SZ_LINE, "h=r;v=c;s=%.2f")
call pargr (sz_char)
call sprintf (fmt4, SZ_LINE, "h=l;v=c;s=%.2f")
call pargr (sz_char)
# Draw inner and outer perimeter
kk = k[1]
do i = 1, 2 {
xspace = kk * xdist
yspace = kk * ydist
call gline (gp, xs - xspace, ys - yspace, xe + xspace, ys - yspace)
call gline (gp, xe + xspace, ys - yspace, xe + xspace, ye + yspace)
call gline (gp, xe + xspace, ye + yspace, xs - xspace, ye + yspace)
call gline (gp, xs - xspace, ye + yspace, xs - xspace, ys - yspace)
kk = k[2]
}
# Now draw x axis tick marks, along both the bottom and top of
# the picture. First find the endpoint integer pixels.
first_col = int (xs)
last_col = int (xe)
# Determine increments of ticks and tick labels for x axis
cnt_step = 1
cnt_label = 10
if (last_col - first_col > 256) {
cnt_step = 10
cnt_label = 100
} else if (last_col - first_col < 26) {
cnt_step = 1
cnt_label = 1
}
first_tick = first_col
bias = mod (first_tick, cnt_step)
last_tick = last_col + bias
do i = first_tick, last_tick, cnt_step {
col = real (i - bias)
call gline (gp, col, ys - k[1] * ydist, col, ys - k[2] * ydist)
call gline (gp, col, ye + k[1] * ydist, col, ye + k[2] * ydist)
if (mod ((i - bias), cnt_label) == 0) {
# Label tick mark; calculate number of characters needed
nchar = 3
if (int (col) == 0)
nchar = 1
if (int (col) >= 1000)
nchar = 4
dummy = itoc (int(col), label, nchar)
# Position label slightly below outer perimeter. Seperation
# is twenty percent of a character width, in WCS.
label_pos = ys - (k[2] * ydist + (cw * 0.20 * dy))
call gtext (gp, col, label_pos, label, fmt1)
# Position label slightly above outer perimeter
label_pos = ye + (k[2] * ydist + (cw * 0.20 * dy))
call gtext (gp, col, label_pos, label, fmt2)
}
}
# Label the y axis tick marks along the left and right sides of the
# picture. First find the integer pixel endpoints.
first_row = int (ys)
last_row = int (ye)
# Determine increments of ticks and tick labels for y axis
cnt_step = 1
cnt_label = 10
if (last_row - first_row > 256) {
cnt_step = 10
cnt_label = 100
} else if (last_row - first_row < 26) {
cnt_step = 1
cnt_label = 1
}
first_tick = first_row
bias = mod (first_tick, cnt_step)
last_tick = last_row + bias
do i = first_tick, last_tick, cnt_step {
row = real (i - bias)
call gline (gp, xs - k[1] * xdist, row, xs - k[2] * xdist, row)
call gline (gp, xe + k[1] * xdist, row, xe + k[2] * xdist, row)
if (mod ((i - bias), cnt_label) == 0) {
# Label tick mark; calculate number of characters needed
nchar = 3
if (int (row) == 0)
nchar = 1
else if (int (row) >= 1000)
nchar = 4
dummy = itoc (int(row), label, nchar)
# Position label slightly to the left of outer perimeter.
# Separation twenty percent of a character width, in WCS.
label_pos = xs - (k[2] * xdist + (cw * 0.20 * dx))
call gtext (gp, label_pos, row, label, fmt3)
# Position label slightly to the right of outer perimeter
label_pos = xe + (k[2] * xdist + (cw * 0.20 * dx))
call gtext (gp, label_pos, row, label, fmt4)
}
}
end
|