1 /*UVA11817
2
3 计算几何:
4
5 总结一下公式:
6
7 1、给定圆上两点坐标
8
9 设直线距离=d
10
11 圆弧距离=2*asin(d/2/r)*r
12
13 2、拓展到球体上
14
15 设直线距离=d
16
17 最短圆弧距离=和上面相同
18
19 这里有个弯要转一下,最短弧的切面必过圆心
20
21 3、地球上坐标点用经纬度表示
22
23 from:摘录
24
25 设第一点A的经纬度为(LonA, LatA),第二点B的经纬度为(LonB, LatB),
26
27 按照0度经线的基准,东经北纬取经度的正值(Longitude),西经南纬取经度负值(-Longitude),
28
29 由(lng,lat)求的的相对三维坐标
30
31 x = R*cos(lat)*cos(lng);
32
33 y = R*cos(lat)*sin(lng);
34
35 z = R*sin(lat);
36
37 //lat维度,lng经度
38
39
40
41 ps:通过邮政编码查询经纬度...这也可以
42
43
44
45 */
46
47 #include <stdio.h>
48
49 #include <stdlib.h>
50
51 #include <string.h>
52
53 #include <math.h>
54
55 #include <ctype.h>
56
57 #include <string>
58
59 #include <iostream>
60
61 #include <sstream>
62
63 #include <vector>
64
65 #include <queue>
66
67 #include <stack>
68
69 #include <map>
70
71 #include <list>
72
73 #include <set>
74
75 #include <algorithm>
76
77
78
79 using namespace std;
80
81
82
83 int main()
84
85 {
86
87 int t;
88
89 double r=6371009;
90
91 double lat1,lng1,lat2,lng2,x1,x2,y1,y2,z1,z2,d,d2;
92
93 cin>>t;
94
95 while(t--)
96
97 {//lat纬度,lng经度
98
99 cin>>lat1>>lng1>>lat2>>lng2;
100
101
102
103 lat1=lat1/180 * M_PI;
104
105 lat2=lat2/180 * M_PI;
106
107 lng1=lng1/180 * M_PI;
108
109 lng2=lng2/180 * M_PI;
110
111
112
113 x1 = r*cos(lat1)*cos(lng1);
114
115 y1 = r*cos(lat1)*sin(lng1);
116
117 z1 = r*sin(lat1);
118
119 x2 = r*cos(lat2)*cos(lng2);
120
121 y2 = r*cos(lat2)*sin(lng2);
122
123 z2 = r*sin(lat2);
124
125
126
127 d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));
128
129 d2 = 2*asin(d/2/r)*r;
130
131
132
133 cout<<(long long)(d2-d+0.5)<<endl;
134
135 }
136
137 }
138
139