diff options
author | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
---|---|---|
committer | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
commit | 40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch) | |
tree | 4464880c571602d54f6ae114729bf62a89518057 /sys/mwcs/wftan.x | |
download | iraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz |
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'sys/mwcs/wftan.x')
-rw-r--r-- | sys/mwcs/wftan.x | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/sys/mwcs/wftan.x b/sys/mwcs/wftan.x new file mode 100644 index 00000000..2c5a0c5f --- /dev/null +++ b/sys/mwcs/wftan.x @@ -0,0 +1,145 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include <math.h> +include "mwcs.h" + +.help WFTAN +.nf ------------------------------------------------------------------------- +WFTAN -- WCS function driver for the tangent plane (gnonomic) projection. + +Driver routines: + + FN_INIT wf_tan_init (fc, dir) + FN_DESTROY (none) + FN_FWD wf_tan_fwd (fc, v1, v2) + FN_INV wf_tan_inv (fc, v1, v2) + +.endhelp -------------------------------------------------------------------- + +# Driver specific fields of function call (FC) descriptor. +define FC_IRA Memi[$1+FCU] # RA axis (1 or 2) +define FC_IDEC Memi[$1+FCU+1] # DEC axis (1 or 2) +define FC_COSDEC Memd[P2D($1+FCU+2)] # cosine(dec) +define FC_SINDEC Memd[P2D($1+FCU+4)] # sine(dec) +define FC_W Memd[P2D($1+FCU+6)+($2)-1] # W (CRVAL) for each axis + + +# WF_TAN_INIT -- Initialize the tangent plane forward or inverse transform. +# Initialization for this transformation consists of determining which axis +# is RA and which is DEC, and precomputing the sine and cosine of the +# declination at the reference point. In order to determine the axis order, +# the parameter "axtype={ra|dec}" must have been set in the attribute list +# for the function. + +procedure wf_tan_init (fc, dir) + +pointer fc #I pointer to FC descriptor +int dir #I direction of transform + +int i +double dec +pointer ct, mw, wp, wv +errchk wf_decaxis + +begin + ct = FC_CT(fc) + mw = CT_MW(ct) + wp = FC_WCS(fc) + + # Determine which is the DEC axis, and hence the axis order. + call wf_decaxis (fc, FC_IRA(fc), FC_IDEC(fc)) + + # Get the value of W for each axis, i.e., the world coordinate at + # the reference point. + + wv = MI_DBUF(mw) + WCS_W(wp) - 1 + do i = 1, 2 + FC_W(fc,i) = Memd[wv+CT_AXIS(ct,FC_AXIS(fc,i))-1] + + # Precompute the sin and cos of the declination at the reference pixel. + dec = DEGTORAD(FC_W(fc,FC_IDEC(fc))) + FC_COSDEC(fc) = cos(dec) + FC_SINDEC(fc) = sin(dec) +end + + +# WF_TAN_FWD -- Forward transform (physical to world), tangent plane +# projection. Based on code from STScI, Hodge et. al. + +procedure wf_tan_fwd (fc, p, w) + +pointer fc #I pointer to FC descriptor +double p[2] #I physical coordinates (xi, eta) +double w[2] #O world coordinates (ra, dec) + +int ira, idec +double xi, eta, x, y, z, ra, dec + +begin + ira = FC_IRA(fc) + idec = FC_IDEC(fc) + + xi = DEGTORAD(p[ira]) + eta = DEGTORAD(p[idec]) + + # Rotate the rectangular coordinate system of the vector [1,xi,eta] + # by the declination so that the X axis will pass through the equator. + + x = FC_COSDEC(fc) - eta * FC_SINDEC(fc) + y = xi + z = FC_SINDEC(fc) + eta * FC_COSDEC(fc) + + # Compute RA and DEC in radians. + if (x == 0.0D0 && y == 0.0D0) + ra = 0.0D0 + else + ra = atan2 (y, x) + dec = atan2 (z, sqrt (x*x + y*y)) + + # Return RA and DEC in degrees. + dec = RADTODEG(dec) + ra = RADTODEG(ra) + FC_W(fc,ira) + + if (ra < 0) + ra = ra + 360D0 + else if (ra > 360D0) + ra = ra - 360D0 + + w[ira] = ra + w[idec] = dec +end + + +# WF_TAN_INV -- Inverse transform (world to physical) for the tangent plane +# projection. Based on code from STScI, Hodge et. al. + +procedure wf_tan_inv (fc, w, p) + +pointer fc #I pointer to FC descriptor +double w[2] #I input world (RA, DEC) coordinates +double p[2] #I output physical coordinates + +int ira, idec +double ra, dec, xi, eta +double cosra, cosdec, sinra, sindec, cosdist + +begin + ira = FC_IRA(fc) + idec = FC_IDEC(fc) + + ra = DEGTORAD (w[ira] - FC_W(fc,ira)) + dec = DEGTORAD (w[idec]) + + cosra = cos (ra) + sinra = sin (ra) + cosdec = cos (dec) + sindec = sin (dec) + cosdist = sindec * FC_SINDEC(fc) + cosdec * FC_COSDEC(fc) * cosra + + xi = cosdec * sinra / cosdist + eta = (sindec * FC_COSDEC(fc) - cosdec * FC_SINDEC(fc) * cosra) / + cosdist + + p[ira] = RADTODEG(xi) + p[idec] = RADTODEG(eta) +end |