Каково же было мое удивление, когда я узнал, что стандартное сипипишное math.h не содержит в себе простейших функций по конвертации градусов в радианы и наоборот! Как ни странно, но это так. Ну что же, это легко исправить — подумал и сделал я.
Зачем мне это понадобилось? Ответ очень прост — при использовании проекции Меркатора необходимо учитывать, что стандартные формулы рассчитаны на работу в радиальном измерении.
Напомню, что Проекция Меркатора — одна из основных картографических проекций, используемая для развертки сферы на цилиндр. Результат вы видите каждый раз, когда смотрите на карту, а не на глобус.
//-----------------------------------------------------------------------------
// File: a_umath.h
//
// Desc:
//-----------------------------------------------------------------------------
#ifndef A_UMATH_H
#define A_UMATH_H
#include <math.h>
// Sombunall versions of math.h already define M_PI
#ifndef M_PI
// You can extend this approximation as far as you need to;
// this version was copied from the MINGW GCC headers
#define M_PI 3.14159265358979323846
#endif
#define DEG_CIRCLE 360
#define DEG_TO_RAD (M_PI / (DEG_CIRCLE / 2))
#define RAD_TO_DEG ((DEG_CIRCLE / 2) / M_PI)
// Simple math functions for circle operations
//-----------------------------------------------------------------------------
namespace UMATH {
// Mercator projection
inline double applyMercatorProjection(double radians) {
return log( (1+sin(radians)) / (1-sin(radians)) )/2;
}
// Degree to radian
inline double deg2rad(double degrees) {
return degrees * DEG_TO_RAD;
}
// Radian to degree
inline double rad2deg(double radians) {
return radians * RAD_TO_DEG;
}
}
#endif // A_UMATH_H