WCSLIB 8.2.2
Loading...
Searching...
No Matches
wcstrig.h
Go to the documentation of this file.
1/*============================================================================
2 WCSLIB 8.2 - an implementation of the FITS WCS standard.
3 Copyright (C) 1995-2023, 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 8.2.1.1 2023/11/16 10:05:57 mcalabre Exp mcalabre $
23*=============================================================================
24*
25* WCSLIB 8.2 - 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
169extern "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
195double cosd(double angle);
196double sind(double angle);
197void sincosd(double angle, double *sin, double *cos);
198double tand(double angle);
199double acosd(double x);
200double asind(double y);
201double atand(double s);
202double 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.