23 inline auto forward(
const auto lon,
const auto lat) {
24 constexpr auto lon0 = constants::aeaLon0;
25 constexpr auto lat0 = constants::aeaLat0;
26 constexpr auto stdParallel1 = constants::aeaStdParallel1;
27 constexpr auto stdParallel2 = constants::aeaStdParallel2;
28 constexpr auto R = constants::aeaEarthRadius;
30 constexpr auto toRad = M_PI / 180.0;
32 constexpr auto stdParallel1Rad = stdParallel1 * toRad;
33 constexpr auto stdParallel2Rad = stdParallel2 * toRad;
34 constexpr auto lat0Rad = lat0 * toRad;
35 constexpr auto lon0Rad = lon0 * toRad;
37 const auto lonRad = lon * toRad;
38 const auto latRad = lat * toRad;
40 static const auto n = (std::sin(stdParallel1Rad) + std::sin(stdParallel2Rad)) / 2;
41 static const auto C = (std::cos(stdParallel1Rad) * std::cos(stdParallel1Rad))
42 + (2 * n * std::sin(stdParallel1Rad));
43 static const auto p0 = R * std::sqrt(C - (2 * n * std::sin(lat0Rad))) / n;
45 const auto p = R * std::sqrt(C - (2 * n * std::sin(latRad))) / n;
46 const auto theta = n * (lonRad - lon0Rad);
48 const auto x = p * std::sin(theta);
49 const auto y = p0 - (p * std::cos(theta));
51 return std::pair{x, y};
64 inline auto inverse(
const auto x,
const auto y) {
65 constexpr auto lon0 = constants::aeaLon0;
66 constexpr auto lat0 = constants::aeaLat0;
67 constexpr auto stdParallel1 = constants::aeaStdParallel1;
68 constexpr auto stdParallel2 = constants::aeaStdParallel2;
69 constexpr auto R = constants::aeaEarthRadius;
71 constexpr auto toRad = M_PI / 180.0;
73 constexpr auto stdParallel1Rad = stdParallel1 * toRad;
74 constexpr auto stdParallel2Rad = stdParallel2 * toRad;
75 constexpr auto lat0Rad = lat0 * toRad;
76 constexpr auto lon0Rad = lon0 * toRad;
78 static const auto n = (std::sin(stdParallel1Rad) + std::sin(stdParallel2Rad)) / 2;
79 static const auto C = (std::cos(stdParallel1Rad) * std::cos(stdParallel1Rad))
80 + (2 * n * std::sin(stdParallel1Rad));
81 static const auto p0 = R * std::sqrt(C - (2 * n * std::sin(lat0Rad))) / n;
83 const auto p = std::sqrt((x * x) + ((p0 - y) * (p0 - y)));
84 const auto theta = std::atan2(x, p0 - y);
86 const auto lat = std::asin((C - ((p * n / R) * (p * n / R))) / (2 * n));
87 const auto lon = lon0Rad + (theta / n);
89 return std::pair{lon / toRad, lat / toRad};