## File: palDtps2c.c

package info (click to toggle)
 `123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151` ``````/* *+ * Name: * palDtps2c * Purpose: * Determine RA,Dec of tangent point from coordinates * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDtps2c( double xi, double eta, double ra, double dec, * double * raz1, double decz1, * double * raz2, double decz2, int *n); * Arguments: * xi = double (Given) * First rectangular coordinate on tangent plane (radians) * eta = double (Given) * Second rectangular coordinate on tangent plane (radians) * ra = double (Given) * RA spherical coordinate of star (radians) * dec = double (Given) * Dec spherical coordinate of star (radians) * raz1 = double * (Returned) * RA spherical coordinate of tangent point, solution 1 (radians) * decz1 = double * (Returned) * Dec spherical coordinate of tangent point, solution 1 (radians) * raz2 = double * (Returned) * RA spherical coordinate of tangent point, solution 2 (radians) * decz2 = double * (Returned) * Dec spherical coordinate of tangent point, solution 2 (radians) * n = int * (Returned) * number of solutions: 0 = no solutions returned (note 2) * 1 = only the first solution is useful (note 3) * 2 = both solutions are useful (note 3) * Description: * From the tangent plane coordinates of a star of known RA,Dec, * determine the RA,Dec of the tangent point. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - The RAZ1 and RAZ2 values are returned in the range 0-2pi. * - Cases where there is no solution can only arise near the poles. * For example, it is clearly impossible for a star at the pole * itself to have a non-zero XI value, and hence it is * meaningless to ask where the tangent point would have to be * to bring about this combination of XI and DEC. * - Also near the poles, cases can arise where there are two useful * solutions. The argument N indicates whether the second of the * two solutions returned is useful. N=1 indicates only one useful * solution, the usual case; under these circumstances, the second * solution corresponds to the "over-the-pole" case, and this is * reflected in the values of RAZ2 and DECZ2 which are returned. * - The DECZ1 and DECZ2 values are returned in the range +/-pi, but * in the usual, non-pole-crossing, case, the range is +/-pi/2. * - This routine is the spherical equivalent of the routine sla_DTPV2C. * History: * 2012-02-08 (TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program 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. * * This program 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 * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" #include void palDtps2c( double xi, double eta, double ra, double dec, double * raz1, double * decz1, double * raz2, double * decz2, int *n) { double x2; double y2; double sd; double cd; double sdf; double r2; x2 = xi * xi; y2 = eta * eta; sd = sin(dec); cd = cos(dec); sdf = sd * sqrt(x2 + 1. + y2); r2 = cd * cd * (y2 + 1.) - sd * sd * x2; if (r2 >= 0.) { double r; double s; double c; r = sqrt(r2); s = sdf - eta * r; c = sdf * eta + r; if (xi == 0. && r == 0.) { r = 1.; } *raz1 = eraAnp(ra - atan2(xi, r)); *decz1 = atan2(s, c); r = -r; s = sdf - eta * r; c = sdf * eta + r; *raz2 = eraAnp(ra - atan2(xi, r)); *decz2 = atan2(s, c); if (fabs(sdf) < 1.) { *n = 1; } else { *n = 2; } } else { *n = 0; } return; } ``````