MLIB
Loading...
Searching...
No Matches
convert.h
Go to the documentation of this file.
1/*
2 Copyright (c) Mircea Neacsu (2014-2025) Licensed under MIT License.
3 This file is part of MLIB project. See LICENSE file for full license terms.
4*/
5
6#pragma once
12
13#include <math.h>
14#include <numbers>
15#include <string>
16#include <cmath>
17
18#ifndef M_PI
20#define M_PI std::numbers::pi
21#endif
22
23// Useful constants
24
26constexpr double D2R = M_PI / 180.;
27
29constexpr double A_WGS84 = 6378137.000;
30
32constexpr double F_WGS84 = 0.003352810664747;
33
35constexpr double F1_WGS84 = 298.257223563;
36
37#define NM2M 1852.
38#define MPS2KNOT (3600. / NM2M)
39#define USFOOT2M (1200. / 3937.)
40
42constexpr double MAS = M_PI / (180 * 3600000.);
43
44
47constexpr double operator"" _ftUS (long double ftus)
48{
49 return ftus * USFOOT2M;
50}
51
52constexpr double operator"" _ftUS (unsigned long long ftus)
53{
54 return ftus * USFOOT2M;
55}
56
57
60constexpr double operator"" _nmi (long double nmi)
61{
62 return nmi * NM2M;
63}
64
65constexpr double operator"" _nmi (unsigned long long nmi)
66{
67 return nmi * NM2M;
68}
69
70
71// ================== Degrees conversion functions ==========================
72
73// Decimal degrees---------------------------------------------------------
74
76constexpr double DEG (double dd)
77{
78 return dd * D2R;
79}
80
82constexpr double D2rad (double dd)
83{
84 return dd * D2R;
85}
86
88constexpr double rad2D (double r)
89{
90 return r / D2R;
91}
92
93// Degrees, minutes --------------------------------------------------------
94
96constexpr double DM (double dd, double mm)
97{
98 return (dd + mm / 60.) * D2R;
99}
100
102constexpr double DM2deg (double ddmm)
103{
104 int sign = (ddmm >= 0) ? 1 : -1;
105 if (ddmm < 0)
106 ddmm = -ddmm;
107 int deg = (int)(ddmm / 100.);
108 ddmm -= (double)deg * 100.;
109 return sign * (deg + ddmm / 60.);
110}
111
113constexpr double deg2DM (double dd)
114{
115 int deg = (int)dd;
116 return (dd - deg) * 60. + deg * 100.;
117}
118
120constexpr double rad2DM (double rad)
121{
122 return deg2DM (rad / D2R);
123}
124
126constexpr double DM2rad (double val)
127{
128 return DM2deg (val) * D2R;
129}
130
131// Degrees, minutes, seconds ------------------------------------------------
132
134constexpr double DMS (double dd, double mm, double ss)
135{
136 return (dd + mm / 60. + ss / 3600.) * D2R;
137}
138
140constexpr double DMS2deg (double dms)
141{
142 int sign = (dms >= 0) ? 1 : -1;
143 if (dms < 0)
144 dms = -dms;
145 int deg = (int)(dms / 10000.);
146 dms -= (double)deg * 10000;
147 int min = (int)(dms / 100.);
148 dms -= (double)min * 100.;
149 return sign * (deg + min / 60. + dms / 3600.);
150}
151
153constexpr double DMS2rad (double dms)
154{
155 return DMS2deg (dms) * D2R;
156}
157
158// =================== Angle units literal operators =========================
159
162constexpr double operator"" _deg (long double deg)
163{
164 return deg * D2R;
165}
166
167constexpr double operator"" _deg (unsigned long long deg)
168{
169 return deg * D2R;
170}
171
172
175constexpr double operator"" _arcmin (long double min)
176{
177 return min/60. * D2R;
178}
179
180constexpr double operator"" _arcmin (unsigned long long min)
181{
182 return min/60. * D2R;
183}
184
185
188constexpr double operator ""_dm (long double val)
189{
190 return DM2rad (val);
191}
192
193constexpr double operator ""_dm (unsigned long long val)
194{
195 return DM2rad ((double)val);
196}
197
198
201constexpr double operator ""_dms (long double val)
202{
203 return DMS2rad (val);
204}
205
206constexpr double operator ""_dms (unsigned long long val)
207{
208 return DMS2rad ((double)val);
209}
210
211
214constexpr double operator"" _arcsec (long double sec)
215{
216 return sec/3600. * D2R;
217}
218
219constexpr double operator"" _arcsec (unsigned long long sec)
220{
221 return sec/3600. * D2R;
222}
223
224
228constexpr double operator"" _mas (long double mas)
229{
230 return mas * MAS;
231}
232
233constexpr double operator"" _mas (unsigned long long mas)
234{
235 return mas * MAS;
236}
237
238
239
240namespace mlib {
242double deg_reduce (double value);
243
246{
250};
251
253std::string degtoa (double degrees, deg_fmt format, bool latitude, int precision);
254
256double atodeg (const std::string& str);
257
266template <typename T>
267std::pair<T, T> sincos (T val)
268{
269 return {std::sin (val), std::cos (val)};
270}
271} // namespace mlib
272
std::pair< T, T > sincos(T val)
A handy template to get sin and cos in a single function call.
Definition convert.h:267
deg_fmt
Formatting options for degtoa() function.
Definition convert.h:246
@ minutes
Degrees, minutes format (DD°MM.mmmm')
Definition convert.h:248
@ degrees
Decimal degrees (DD.dddd°)
Definition convert.h:247
@ seconds
Degrees, minutes, seconds format (DD°MM'SS.sss")
Definition convert.h:249
double deg_reduce(double value)
Reduces a degrees value to [0,360) interval.
Definition convert.cpp:47
constexpr double rad2DM(double rad)
Convert from radians to degrees, minutes (DDMM.mmm)
Definition convert.h:120
constexpr double DM2rad(double val)
Convert degrees, minutes (DDMM.mmm) to radians.
Definition convert.h:126
constexpr double DMS2rad(double dms)
Convert degrees, minutes, seconds (DDMMSS.sss) to radians.
Definition convert.h:153
constexpr double DMS2deg(double dms)
Convert degrees, minutes, seconds (DDMMSS.sss) to decimal degrees.
Definition convert.h:140
constexpr double F_WGS84
Flattening of WGS84 ellipsoid.
Definition convert.h:32
#define USFOOT2M
US Survey foot to meters conversion factor.
Definition convert.h:39
constexpr double MAS
milli-arcsecond
Definition convert.h:42
double atodeg(const std::string &str)
Conversion from string to decimal degrees.
Definition convert.cpp:128
constexpr double DM(double dd, double mm)
Convert degrees, minutes to radians.
Definition convert.h:96
#define NM2M
Nautical mile to meters conversion factor.
Definition convert.h:37
constexpr double DEG(double dd)
Convert decimal degrees to radians.
Definition convert.h:76
constexpr double F1_WGS84
Inverse of flattening for WGS84 ellipsoid.
Definition convert.h:35
constexpr double D2R
Degrees to radians conversion factor.
Definition convert.h:26
constexpr double D2rad(double dd)
Convert decimal degrees to radians.
Definition convert.h:82
constexpr double deg2DM(double dd)
Convert decimal degrees to degrees, minutes (DDMM.mmm)
Definition convert.h:113
constexpr double rad2D(double r)
Convert radians to decimal degrees.
Definition convert.h:88
constexpr double DM2deg(double ddmm)
Convert degrees, minutes (DDMM.mmm) to decimal degrees.
Definition convert.h:102
#define M_PI
Older name for std::numbers::pi
Definition convert.h:20
std::string degtoa(double degrees, deg_fmt format, bool latitude, int precision)
Conversion from degrees to a string.
Definition convert.cpp:72
constexpr double A_WGS84
Semimajor axis of WGS84 ellipsoid.
Definition convert.h:29
constexpr double DMS(double dd, double mm, double ss)
Convert degrees, minutes seconds to radians.
Definition convert.h:134