1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
struct LatLon {
double lat = 0;
double lon = 0;
};
int main(int argc, char** argv) {
const double PI = 3.141592653589793;
const double DEG_TO_RAD = PI / 180.0;
const double RAD_TO_DEG = 180 / PI;
LatLon gps;
gps.lat = 12.34;
gps.lon = 56.78;
const double directionDeg = 45;
const double distanceKm = 1000;
const double radiusKm = 6371;
LatLon site;
site.lat = 18.606373170899;
site.lon = 63.477594317657;
double lat = asin(sin(gps.lat * DEG_TO_RAD) * cos(distanceKm / radiusKm) + cos(gps.lat * DEG_TO_RAD) * sin(distanceKm / radiusKm) * cos(directionDeg * DEG_TO_RAD));
double lon = (gps.lon * DEG_TO_RAD) + atan2(sin(directionDeg * DEG_TO_RAD) * sin(distanceKm / radiusKm) * cos(gps.lat * DEG_TO_RAD),
cos(distanceKm / radiusKm) - sin(gps.lat * DEG_TO_RAD) * sin(lat));
lat = lat * RAD_TO_DEG;
lon = lon * RAD_TO_DEG;
LatLon res;
res.lat = lat;
res.lon = lon;
printf("From (ϕ1,λ1) = ( %f, %f), azimuth θ = %f°, distance d = %fKm -> (ϕ2,λ2) = ( %f, %f)\n", gps.lat, gps.lon, directionDeg, distanceKm, lat, lon);
printf("Was expecting (ϕ2,λ2) = ( %f, %f)\n", site.lat, site.lon);
printf("\n");
printf("From (ϕ1,λ1) = ( %.20f, %.20f), azimuth θ = %f°, distance d = %fKm -> (ϕ2,λ2) = ( %.20f, %.20f)\n", gps.lat, gps.lon, directionDeg, distanceKm, lat, lon);
printf("Was expecting (ϕ2,λ2) = ( %.20f, %.20f)\n", site.lat, site.lon);
return EXIT_SUCCESS;
} |
Partager