/*============================================================================ WCSLIB 4.3 - an implementation of the FITS WCS standard. Copyright (C) 1995-2007, Mark Calabretta This file is part of WCSLIB. WCSLIB is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. WCSLIB is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with WCSLIB. If not, see . Correspondence concerning WCSLIB may be directed to: Internet email: mcalabre@atnf.csiro.au Postal address: Dr. Mark Calabretta Australia Telescope National Facility, CSIRO PO Box 76 Epping NSW 1710 AUSTRALIA Author: Mark Calabretta, Australia Telescope National Facility http://www.atnf.csiro.au/~mcalabre/index.html $Id: ttab3.c,v 4.3 2007/12/27 05:35:51 cal103 Exp $ *============================================================================= * * ttab3 tests the -TAB routines using PGPLOT for graphical display. It * constructs a table that approximates Bonne's projection and uses it to * draw a graticule. * *---------------------------------------------------------------------------*/ #include #include #include #include #include #include #include #define K1 271 #define K2 235 int main() { /* Set up the lookup table. */ const int M = 2; const int K[] = {K1, K2}; const int map[] = {0, 1}; const double crval[] = {135.0, 95.0}; char text[80]; int ci, i, ilat, ilng, j, k, m, stat[K2][K1], status; float xr[361], yr[361]; double *dp, world[361][2], x[K1], xy[361][2], y[K2]; struct tabprm tab; struct prjprm prj; printf( "Testing WCSLIB inverse coordinate lookup table routines (ttab3.c)\n" "-----------------------------------------------------------------\n"); /* List status return messages. */ printf("\nList of tab status return values:\n"); for (status = 1; status <= 5; status++) { printf("%4d: %s.\n", status, tab_errmsg[status]); } printf("\n"); /* PGPLOT initialization. */ strcpy(text, "/xwindow"); cpgbeg(0, text, 1, 1); cpgvstd(); cpgsch(0.7f); cpgwnad(-135.0f, 135.0f, -95.0f, 140.0f); cpgbox("BC", 0.0f, 0, "BC", 0.0f, 0); cpgscr(0, 0.00f, 0.00f, 0.00f); cpgscr(1, 1.00f, 1.00f, 0.00f); cpgscr(2, 1.00f, 1.00f, 1.00f); cpgscr(3, 0.50f, 0.50f, 0.80f); cpgscr(4, 0.80f, 0.50f, 0.50f); cpgscr(5, 0.80f, 0.80f, 0.80f); cpgscr(6, 0.50f, 0.50f, 0.80f); cpgscr(7, 0.80f, 0.50f, 0.50f); cpgscr(8, 0.30f, 0.50f, 0.30f); /* Set up the lookup table. */ tab.flag = -1; if ((status = tabini(1, M, K, &tab))) { printf("tabini ERROR %d: %s.\n", status, tab_errmsg[status]); return 1; } tab.M = M; for (m = 0; m < tab.M; m++) { tab.K[m] = K[m]; tab.map[m] = map[m]; tab.crval[m] = crval[m]; for (k = 0; k < tab.K[m]; k++) { tab.index[m][k] = (double)k; } } /* Set up the lookup table to approximate Bonne's projection. */ for (i = 0; i < K1; i++) { x[i] = 135 - i; } for (j = 0; j < K2; j++) { y[j] = j - 95; } prjini(&prj); prj.pv[1] = 35.0; status = bonx2s(&prj, K1, K2, 1, 2, x, y, tab.coord, tab.coord+1, (int *)stat); dp = tab.coord; for (j = 0; j < K2; j++) { for (i = 0; i < K1; i++) { if (stat[j][i]) { *dp = 999.0; *(dp+1) = 999.0; } dp += 2; } } /* Draw meridians. */ ci = 1; for (ilng = -180; ilng <= 180; ilng += 15) { if (++ci > 7) ci = 2; cpgsci(ilng?ci:1); for (j = 0, ilat = -90; ilat <= 90; ilat++, j++) { world[j][0] = (double)ilng; world[j][1] = (double)ilat; } /* A fudge to account for the singularity at the poles. */ world[0][0] = 0.0; world[180][0] = 0.0; status = tabs2x(&tab, 181, 2, (double *)world, (double *)xy, (int *)stat); k = 0; for (j = 0; j < 181; j++) { if (stat[0][j]) { if (k > 1) cpgline(k, xr, yr); k = 0; continue; } xr[k] = xy[j][0]; yr[k] = xy[j][1]; k++; } cpgline(k, xr, yr); } /* Draw parallels. */ ci = 1; for (ilat = -75; ilat <= 75; ilat += 15) { if (++ci > 7) ci = 2; cpgsci(ilat?ci:1); for (j = 0, ilng = -180; ilng <= 180; ilng++, j++) { world[j][0] = (double)ilng; world[j][1] = (double)ilat; } status = tabs2x(&tab, 361, 2, (double *)world, (double *)xy, (int *)stat); k = 0; for (j = 0; j < 361; j++) { if (stat[0][j]) { if (k > 1) cpgline(k, xr, yr); k = 0; continue; } xr[k] = xy[j][0]; yr[k] = xy[j][1]; k++; } cpgline(k, xr, yr); } cpgend(); return 0; }