fd7470c89595a93eb44f03f1641d63756250dd43
[olsrd.git] / lib / pud / nmealib / include / nmea / gmath.h
1 /*
2  * This file is part of nmealib.
3  *
4  * Copyright (c) 2008 Timur Sinitsyn
5  * Copyright (c) 2011 Ferry Huberts
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #ifndef __NMEA_GMATH_H__
22 #define __NMEA_GMATH_H__
23
24 #include <nmea/info.h>
25
26 #define NMEA_TUD_YARDS              (1.0936133)                     /**< Yards, meter * NMEA_TUD_YARDS = yard */
27 #define NMEA_TUD_KNOTS              (1.852)                         /**< Knots, kilometer / NMEA_TUD_KNOTS = knot */
28 #define NMEA_TUD_MILES              (1.609344)                      /**< Miles, kilometer / NMEA_TUD_MILES = mile */
29 #define NMEA_TUS_MS                 (3.6)                           /**< Meters per seconds, (k/h) / NMEA_TUS_MS= (m/s) */
30 #define NMEA_PI                     (3.141592653589793)             /**< PI value */
31 #define NMEA_PI180                  (NMEA_PI / 180)                 /**< PI division by 180 */
32 #define NMEA_EARTHRADIUS_KM         (6378)                          /**< Earth's mean radius in km */
33 #define NMEA_EARTHRADIUS_M          (NMEA_EARTHRADIUS_KM * 1000)    /**< Earth's mean radius in m */
34 #define NMEA_EARTH_SEMIMAJORAXIS_M  (6378137.0)                     /**< Earth's semi-major axis in m according WGS84 */
35 #define NMEA_EARTH_SEMIMAJORAXIS_KM (NMEA_EARTHMAJORAXIS_KM / 1000) /**< Earth's semi-major axis in km according WGS 84 */
36 #define NMEA_EARTH_FLATTENING       (1 / 298.257223563)             /**< Earth's flattening according WGS 84 */
37 #define NMEA_DOP_FACTOR             (5)                             /**< Factor for translating DOP to meters */
38
39 #ifdef  __cplusplus
40 extern "C" {
41 #endif /* __cplusplus */
42
43 /*
44  * degree VS radian
45  */
46
47 double nmea_degree2radian(const double val);
48 double nmea_radian2degree(const double val);
49
50 /*
51  * NDEG (NMEA degree)
52  */
53
54 double nmea_ndeg2degree(const double val);
55 double nmea_degree2ndeg(const double val);
56
57 double nmea_ndeg2radian(const double val);
58 double nmea_radian2ndeg(const double val);
59
60 /*
61  * DOP
62  */
63
64 double nmea_calc_pdop(const double hdop, const double vdop);
65 double nmea_dop2meters(const double dop);
66 double nmea_meters2dop(const double meters);
67
68 /*
69  * positions work
70  */
71
72 void nmea_info2pos(const nmeaINFO *info, nmeaPOS *pos);
73 void nmea_pos2info(const nmeaPOS *pos, nmeaINFO *info);
74
75 double nmea_distance(const nmeaPOS *from_pos, const nmeaPOS *to_pos);
76
77 double nmea_distance_ellipsoid(const nmeaPOS *from_pos, const nmeaPOS *to_pos, double *from_azimuth,
78                 double *to_azimuth);
79
80 int nmea_move_horz(const nmeaPOS *start_pos, nmeaPOS *end_pos, double azimuth, double distance);
81
82 int nmea_move_horz_ellipsoid(const nmeaPOS *start_pos, nmeaPOS *end_pos, double azimuth, double distance,
83                 double *end_azimuth);
84
85 #ifdef  __cplusplus
86 }
87 #endif /* __cplusplus */
88
89 #endif /* __NMEA_GMATH_H__ */