Каково же было мое удивление, когда я узнал, что стандартное сипипишное 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