WCSLIB  7.7
wcstrig.h
Go to the documentation of this file.
1 /*============================================================================
2  WCSLIB 7.7 - an implementation of the FITS WCS standard.
3  Copyright (C) 1995-2021, Mark Calabretta
4 
5  This file is part of WCSLIB.
6 
7  WCSLIB is free software: you can redistribute it and/or modify it under the
8  terms of the GNU Lesser General Public License as published by the Free
9  Software Foundation, either version 3 of the License, or (at your option)
10  any later version.
11 
12  WCSLIB is distributed in the hope that it will be useful, but WITHOUT ANY
13  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
15  more details.
16 
17  You should have received a copy of the GNU Lesser General Public License
18  along with WCSLIB. If not, see http://www.gnu.org/licenses.
19 
20  Author: Mark Calabretta, Australia Telescope National Facility, CSIRO.
21  http://www.atnf.csiro.au/people/Mark.Calabretta
22  $Id: wcstrig.h,v 7.7 2021/07/12 06:36:49 mcalabre Exp $
23 *=============================================================================
24 *
25 * WCSLIB 7.7 - C routines that implement the FITS World Coordinate System
26 * (WCS) standard. Refer to the README file provided with WCSLIB for an
27 * overview of the library.
28 *
29 *
30 * Summary of the wcstrig routines
31 * -------------------------------
32 * When dealing with celestial coordinate systems and spherical projections
33 * (some moreso than others) it is often desirable to use an angular measure
34 * that provides an exact representation of the latitude of the north or south
35 * pole. The WCSLIB routines use the following trigonometric functions that
36 * take or return angles in degrees:
37 *
38 * - cosd()
39 * - sind()
40 * - tand()
41 * - acosd()
42 * - asind()
43 * - atand()
44 * - atan2d()
45 * - sincosd()
46 *
47 * These "trigd" routines are expected to handle angles that are a multiple of
48 * 90 degrees returning an exact result. Some C implementations provide these
49 * as part of a system library and in such cases it may (or may not!) be
50 * preferable to use them. WCSLIB provides wrappers on the standard trig
51 * functions based on radian measure, adding tests for multiples of 90 degrees.
52 *
53 * However, wcstrig.h also provides the choice of using preprocessor macro
54 * implementations of the trigd functions that don't test for multiples of
55 * 90 degrees (compile with -DWCSTRIG_MACRO). These are typically 20% faster
56 * but may lead to problems near the poles.
57 *
58 *
59 * cosd() - Cosine of an angle in degrees
60 * --------------------------------------
61 * cosd() returns the cosine of an angle given in degrees.
62 *
63 * Given:
64 * angle double [deg].
65 *
66 * Function return value:
67 * double Cosine of the angle.
68 *
69 *
70 * sind() - Sine of an angle in degrees
71 * ------------------------------------
72 * sind() returns the sine of an angle given in degrees.
73 *
74 * Given:
75 * angle double [deg].
76 *
77 * Function return value:
78 * double Sine of the angle.
79 *
80 *
81 * sincosd() - Sine and cosine of an angle in degrees
82 * --------------------------------------------------
83 * sincosd() returns the sine and cosine of an angle given in degrees.
84 *
85 * Given:
86 * angle double [deg].
87 *
88 * Returned:
89 * sin *double Sine of the angle.
90 *
91 * cos *double Cosine of the angle.
92 *
93 * Function return value:
94 * void
95 *
96 *
97 * tand() - Tangent of an angle in degrees
98 * ---------------------------------------
99 * tand() returns the tangent of an angle given in degrees.
100 *
101 * Given:
102 * angle double [deg].
103 *
104 * Function return value:
105 * double Tangent of the angle.
106 *
107 *
108 * acosd() - Inverse cosine, returning angle in degrees
109 * ----------------------------------------------------
110 * acosd() returns the inverse cosine in degrees.
111 *
112 * Given:
113 * x double in the range [-1,1].
114 *
115 * Function return value:
116 * double Inverse cosine of x [deg].
117 *
118 *
119 * asind() - Inverse sine, returning angle in degrees
120 * --------------------------------------------------
121 * asind() returns the inverse sine in degrees.
122 *
123 * Given:
124 * y double in the range [-1,1].
125 *
126 * Function return value:
127 * double Inverse sine of y [deg].
128 *
129 *
130 * atand() - Inverse tangent, returning angle in degrees
131 * -----------------------------------------------------
132 * atand() returns the inverse tangent in degrees.
133 *
134 * Given:
135 * s double
136 *
137 * Function return value:
138 * double Inverse tangent of s [deg].
139 *
140 *
141 * atan2d() - Polar angle of (x,y), in degrees
142 * -------------------------------------------
143 * atan2d() returns the polar angle, beta, in degrees, of polar coordinates
144 * (rho,beta) corresponding to Cartesian coordinates (x,y). It is equivalent
145 * to the arg(x,y) function of WCS Paper II, though with transposed arguments.
146 *
147 * Given:
148 * y double Cartesian y-coordinate.
149 *
150 * x double Cartesian x-coordinate.
151 *
152 * Function return value:
153 * double Polar angle of (x,y) [deg].
154 *
155 *===========================================================================*/
156 
157 #ifndef WCSLIB_WCSTRIG
158 #define WCSLIB_WCSTRIG
159 
160 #include <math.h>
161 
162 #include "wcsconfig.h"
163 
164 #ifdef HAVE_SINCOS
165  void sincos(double angle, double *sin, double *cos);
166 #endif
167 
168 #ifdef __cplusplus
169 extern "C" {
170 #endif
171 
172 
173 #ifdef WCSTRIG_MACRO
174 
175 // Macro implementation of the trigd functions.
176 #include "wcsmath.h"
177 
178 #define cosd(X) cos((X)*D2R)
179 #define sind(X) sin((X)*D2R)
180 #define tand(X) tan((X)*D2R)
181 #define acosd(X) acos(X)*R2D
182 #define asind(X) asin(X)*R2D
183 #define atand(X) atan(X)*R2D
184 #define atan2d(Y,X) atan2(Y,X)*R2D
185 #ifdef HAVE_SINCOS
186  #define sincosd(X,S,C) sincos((X)*D2R,(S),(C))
187 #else
188  #define sincosd(X,S,C) *(S) = sin((X)*D2R); *(C) = cos((X)*D2R);
189 #endif
190 
191 #else
192 
193 // Use WCSLIB wrappers or native trigd functions.
194 
195 double cosd(double angle);
196 double sind(double angle);
197 void sincosd(double angle, double *sin, double *cos);
198 double tand(double angle);
199 double acosd(double x);
200 double asind(double y);
201 double atand(double s);
202 double atan2d(double y, double x);
203 
204 // Domain tolerance for asin() and acos() functions.
205 #define WCSTRIG_TOL 1e-10
206 
207 #endif // WCSTRIG_MACRO
208 
209 
210 #ifdef __cplusplus
211 }
212 #endif
213 
214 #endif // WCSLIB_WCSTRIG
double sind(double angle)
Sine of an angle in degrees.
double cosd(double angle)
Cosine of an angle in degrees.
double tand(double angle)
Tangent of an angle in degrees.
double asind(double y)
Inverse sine, returning angle in degrees.
double atand(double s)
Inverse tangent, returning angle in degrees.
double acosd(double x)
Inverse cosine, returning angle in degrees.
double atan2d(double y, double x)
Polar angle of , in degrees.
void sincosd(double angle, double *sin, double *cos)
Sine and cosine of an angle in degrees.