#include #include #define PI 3.141592653589793 struct angle { int degres; int minutes; int secondes; char dir; }; struct positionGPS { struct angle latitude; struct angle longitude; }; double convertirVersDoubleEnRadian(struct angle a) { double ang = (a.degres + a.minutes / 60.0 + a.secondes / 3600.0)*PI/180.0; if ((a.dir == 'O') || (a.dir == 'S')) { ang = -ang; } return ang; } double calculerDistanceOrthodromique(struct positionGPS p1, struct positionGPS p2) { double lat1 = convertirVersDoubleEnRadian(p1.latitude); double lat2 = convertirVersDoubleEnRadian(p2.latitude); double lon1 = convertirVersDoubleEnRadian(p1.longitude); double lon2 = convertirVersDoubleEnRadian(p2.longitude); double dist = 6378.0 * acos(sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon2 - lon1)); return dist; } void afficherAngle(struct angle a) { printf("[%03d:%02d:%02d:%c]", a.degres, a.minutes, a.secondes, a.dir); } void afficherPositionGPS(struct positionGPS p) { printf("["); afficherAngle(p.latitude); printf("-"); afficherAngle(p.longitude); printf("]"); } int main(void) { struct positionGPS p1 = { {47,14,16,'N'},{6,1,27,'E'} }; // Besancon struct positionGPS p2 = { {17,32,6,'S'},{149,34,11,'O'} }; // Papeete printf("La distance entre\n"); afficherPositionGPS(p1); printf("\net\n"); afficherPositionGPS(p2); printf("\nest %lf km.\n", calculerDistanceOrthodromique(p1, p2)); return 0; }