#include <stdio.h> #include <math.h> #include <cmath> using namespace std; #define EARTH_RADIUS 6371009 struct cartesian_coordinates { double x, y, z; }; struct geographical_coordinates { double latitude, longitude; }; double dist(cartesian_coordinates p, cartesian_coordinates q) { return sqrt((p.x - q.x) * (p.x - q.x) + (p.y - q.y) * (p.y - q.y) + (p.z - q.z) * (p.z - q.z)); } double degrees_to_radians(double degrees) { return degrees / 180 * M_PI; } cartesian_coordinates geographycal_to_cartesian(geographical_coordinates g, double sphere_radius) { cartesian_coordinates c; c.x = sphere_radius * cos(g.latitude) * cos(g.longitude); c.y = sphere_radius * cos(g.latitude) * sin(g.longitude); c.z = sphere_radius * sin(g.latitude); return c; } double great_circle_distance(geographical_coordinates p1, geographical_coordinates p2, double radius) { double central_angle = acos(sin(p1.latitude) * sin(p2.latitude) + cos(p1.latitude) * cos(p2.latitude) * cos(abs(p1.longitude - p2.longitude))); return central_angle * radius; } int main() { int cases; for (scanf("%d", &cases); cases; cases--) { geographical_coordinates g1, g2; scanf("%lf%lf%lf%lf", &g1.latitude, &g1.longitude, &g2.latitude, &g2.longitude); g1.latitude = degrees_to_radians(g1.latitude); g1.longitude = degrees_to_radians(g1.longitude); g2.latitude = degrees_to_radians(g2.latitude); g2.longitude = degrees_to_radians(g2.longitude); cartesian_coordinates c1 = geographycal_to_cartesian(g1, EARTH_RADIUS); cartesian_coordinates c2 = geographycal_to_cartesian(g2, EARTH_RADIUS); double straight_line_distance = dist(c1, c2); double ggreat_circle_distance = great_circle_distance(g1, g2, EARTH_RADIUS); printf("%.0f\n", ggreat_circle_distance - straight_line_distance); } return 0; }
Thursday, April 23, 2015
UVa 11817 - Tunnelling the Earth
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment