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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <gki.h>
include "stdgraph.h"
define ZSTEP 4 # bit to be tested (step function width)
# STG_PUTCELLARRAY -- Draw a cell array, i.e., two dimensional array of pixels
# (greylevels or colors). The algorithm used here maps 8 bits in into 1 bit
# out, using a step function lookup table. The result is a band-contoured
# image, where the spacing and width of the contour bands decreases as the
# rate of change of intensity in the input cell array increases.
procedure stg_putcellarray (m, nx, ny, ax1,ay1, ax2,ay2)
short m[nx,ny] # cell array
int nx, ny # number of pixels in X and Y
int ax1, ay1 # lower left corner of output window
int ax2, ay2 # upper right corner of output window
real dx, dy
int my, i1, i2, v, i, j, k
include "stdgraph.com"
int and()
begin
# Set polyline width to 1 for max y-res.
call stg_ctrl1 ("LW", 1)
SG_PLWIDTH(g_sg) = 1
# Determine the width of a cell array pixel in GKI units.
dx = real (ax2 - ax1) / nx
# Determine the height of a device pixel in GKI units.
dy = max (1.0, real(GKI_MAXNDC) / real(g_yres))
# Process the cell array. The outer loop runs over device pixels in Y;
# each iteration writes one line of the output raster. The inner loop
# runs down a line of the cell array.
k = 0
for (my = ay1 + dy/2; my < ay2; my = k * dy + ay1) {
j = max(1, min(ny, int (real(my-ay1) / real(ay2-ay1) * (ny-1)) + 1))
my = min (my, int (ay2 - dy/2))
for (i=1; i <= nx; ) {
do i = i, nx {
v = m[i,j]
if (and (v, ZSTEP) != 0)
break
}
if (i <= nx) {
i1 = i
i2 = nx
do i = i1 + 1, nx {
v = m[i,j]
if (and (v, ZSTEP) == 0) {
i2 = i
break
}
}
# The following decreases the length of dark line segments
# to make features more visible.
if (i2 - i1 >= 2)
if (i1 > 1 && i2 < nx) {
i1 = i1 + 1
i2 = i2 - 1
}
# Draw the line segment.
call stg_move (int ((i1-1) * dx + ax1), my)
call stg_draw (int (i2 * dx + ax1), my)
if (i2 >= nx)
i = nx + 1
}
}
k = k + 1
}
end
|