Nmea0183Parser/Inc/Nmea0183_Math.h

77 lines
3.4 KiB
C

//
// Created by villuton on 24.03.25.
//
#ifndef NMEA0183_MATH_H
#define NMEA0183_MATH_H
/*
* G math units
*/
#define NMEA_PI (3.141592653589793) /**< PI value */
#define NMEA_PI180 (NMEA_PI / 180) /**< PI division by 180 */
#define NMEA_EARTHRADIUS_KM (6378) /**< Earth's mean radius in km */
#define NMEA_EARTHRADIUS_M (NMEA_EARTHRADIUS_KM * 1000) /**< Earth's mean radius in m */
#define NMEA_EARTH_SEMIMAJORAXIS_M (6378137.0) /**< Earth's semi-major axis in m according WGS84 */
#define NMEA_EARTH_SEMIMAJORAXIS_KM (NMEA_EARTHMAJORAXIS_KM / 1000) /**< Earth's semi-major axis in km according WGS 84 */
#define NMEA_EARTH_FLATTENING (1 / 298.257223563) /**< Earth's flattening according WGS 84 */
#define NMEA_DOP_FACTOR (5) /**< Factor for translating DOP to meters */
/*
* degree VS radian
*/
double nmeaDegreeToRadian(double val);
double nmeaRadianToDegree(double val);
/*
* NDEG (NMEA degree)
*/
double nmeaNdegToDegree(double val);
double nmeaDegreeToNdeg(double val);
double nmeaNdegToRadian(double val);
double nmeaRadianToNdeg(double val);
/*
* DOP
*/
double nmeaCalcPdop(double hdop, double vdop);
double nmeaDopToMeters(double dop);
double nmeaMetersToDop(double meters);
/*
* positions work
*/
double nmeaCalcDistance(
const double *from_pos_lat, // /**< From position latitude in radians */
const double *from_pos_lon, // /**< From position longitude in radians */
const double *to_pos_lat, // /**< To position latitude in radians */
const double *to_pos_lon // /**< To position longitude in radians */
);
double nmeaCalcDistanceEllipsoid(
const double *from_pos_lat, // /**< From position latitude in radians */
const double *from_pos_lon, // /**< From position longitude in radians */
const double *to_pos_lat, // /**< To position latitude in radians */
const double *to_pos_lon, // /**< To position longitude in radians */
double *from_azimuth, // /**< (O) azimuth at "from" position in radians */
double *to_azimuth // /**< (O) azimuth at "to" position in radians */
);
int nmeaMoveHorz(
const double *start_pos_lat, // /**< Start position latitude in radians */
const double *start_pos_lon, // /**< Start position longitude in radians */
double *end_pos_lat, // /**< Result position latitude in radians */
double *end_pos_lon, // /**< Result position longitude in radians */
double azimuth, // /**< Azimuth (degree) [0, 359] */
double distance // /**< Distance (km) */
);
int nmeaMoveHorzEllipsoid(
const double *start_pos_lat, // /**< Start position latitude in radians */
const double *start_pos_lon, // /**< Start position longitude in radians */
double *end_pos_lat, // /**< (O) Result position latitude in radians */
double *end_pos_lon, // /**< (O) Result position longitude in radians */
double azimuth, // /**< Azimuth in radians */
double distance, // /**< Distance (km) */
double *end_azimuth // /**< (O) Azimuth at end position in radians */
);
#endif //NMEA0183_MATH_H