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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <math/iminterp.h>
include "im1interpdef.h"
# ARIEVAL -- Evaluate the interpolant at a given value of x. Arieval allows
# the interpolation of a few isolated points without the storage required for
# the sequential version. With the exception of the sinc function, the
# interpolation code is expanded directly in this routine to avoid the
# overhead of an aditional function call. The precomputed sinc function is
# not supported and is aliased to the regular sinc function. The default
# sinc function width and precision limits are hardwired to the builtin
# constants NSINC and DX. The default drizzle function pixel fraction is
# hardwired to the builtin constant PIXFRAC. If PIXFRAC is 1.0 then the
# drizzle results are identical to the linear interpolation results.
real procedure arieval (x, datain, npts, interp_type)
real x # x value, 1 <= x <= n
real datain[ARB] # array of data values
int npts # number of data values
int interp_type # interpolant type
int i, k, nearx, pindex
real a[MAX_NDERIVS], cd20, cd21, cd40, cd41, deltax, deltay, hold
real bcoeff[SPLPTS+3], temp[SPLPTS+3], pcoeff[SPLINE3_ORDER]
begin
switch (interp_type) {
case II_NEAREST:
return (datain[int (x + 0.5)])
case II_LINEAR:
nearx = x
# Protect against x = n.
if (nearx >= npts)
hold = 2. * datain[nearx] - datain[nearx - 1]
else
hold = datain[nearx+1]
return ((x - nearx) * hold + (nearx + 1 - x) * datain[nearx])
case II_POLY3:
nearx = x
# Protect against the x = 1 or x = n case.
k = 0
for (i = nearx - 1; i <= nearx + 2; i = i + 1) {
k = k + 1
if (i < 1)
a[k] = 2. * datain[1] - datain[2-i]
else if (i > npts)
a[k] = 2. * datain[npts] - datain[2*npts-i]
else
a[k] = datain[i]
}
deltax = x - nearx
deltay = 1. - deltax
# Second central differences.
cd20 = 1./6. * (a[3] - 2. * a[2] + a[1])
cd21 = 1./6. * (a[4] - 2. * a[3] + a[2])
return (deltax * (a[3] + (deltax * deltax - 1.) * cd21) +
deltay * (a[2] + (deltay * deltay - 1.) * cd20))
case II_POLY5:
nearx = x
# Protect against the x = 1 or x = n case.
k = 0
for (i = nearx - 2; i <= nearx + 3; i = i + 1) {
k = k + 1
if (i < 1)
a[k] = 2. * datain[1] - datain[2-i]
else if (i > npts)
a[k] = 2. * datain[npts] - datain[2*npts-i]
else
a[k] = datain[i]
}
deltax = x - nearx
deltay = 1. - deltax
# Second central differences.
cd20 = 1./6. * (a[4] - 2. * a[3] + a[2])
cd21 = 1./6. * (a[5] - 2. * a[4] + a[3])
# Fourth central differences.
cd40 = 1./120. * (a[1] - 4. * a[2] + 6. * a[3] - 4. * a[4] + a[5])
cd41 = 1./120. * (a[2] - 4. * a[3] + 6. * a[4] - 4. * a[5] + a[6])
return (deltax * (a[4] + (deltax * deltax - 1.) *
(cd21 + (deltax * deltax - 4.) * cd41)) +
deltay * (a[3] + (deltay * deltay - 1.) *
(cd20 + (deltay * deltay - 4.) * cd40)))
case II_SPLINE3:
nearx = x
deltax = x - nearx
k = 0
# Get the data.
for (i = nearx - SPLPTS/2 + 1; i <= nearx + SPLPTS/2; i = i + 1) {
if (i < 1 || i > npts)
;
else {
k = k + 1
if (k == 1)
pindex = nearx - i + 1
bcoeff[k+1] = datain[i]
}
}
bcoeff[1] = 0.
bcoeff[k+2] = 0.
# Compute coefficients.
call ii_spline (bcoeff, temp, k)
pindex = pindex + 1
bcoeff[k+3] = 0.
pcoeff[1] = bcoeff[pindex-1] + 4. * bcoeff[pindex] +
bcoeff[pindex+1]
pcoeff[2] = 3. * (bcoeff[pindex+1] - bcoeff[pindex-1])
pcoeff[3] = 3. * (bcoeff[pindex-1] - 2. * bcoeff[pindex] +
bcoeff[pindex+1])
pcoeff[4] = -bcoeff[pindex-1] + 3. * bcoeff[pindex] - 3. *
bcoeff[pindex+1] + bcoeff[pindex+2]
return (pcoeff[1] + deltax * (pcoeff[2] + deltax *
(pcoeff[3] + deltax * pcoeff[4])))
case II_SINC, II_LSINC:
call ii_sinc (x, hold, 1, datain, npts, NSINC, DX)
return (hold)
case II_DRIZZLE:
call ii_driz1 (x, hold, 1, datain, BADVAL)
return (hold)
}
end
|