经纬度

题意

来源:牛客练习赛17D

给定地球的两个经纬度坐标,问这两个点的球面距离和直线距离的差。假设地球为球体,半径为6371009米。

分析

球面上任意两点间弧长公式:

设所求点A ,纬度β1 ,经度α1 ;点B ,纬度β2 ,经度α2。则距离S=R·arc cos[cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2],其中R为球体半径。

直线距离可以用 $S = R\times \theta$

$L = 2 \times R \times sin(\theta/2)$

代码

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
//ybmj
#include<bits/stdc++.h>
using namespace std;
#define lson (rt << 1)
#define rson (rt << 1 | 1)
#define lson_len (len - (len >> 1))
#define rson_len (len >> 1)
#define pb(x) push_back(x)
#define clr(a, x) memset(a, x, sizeof(a))
#define mp(x, y) make_pair(x, y)
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int INF = 0x3f3f3f3f;
const int NINF = 0xc0c0c0c0;
const double pi = acos(-1);

int main(){
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
std::ios::sync_with_stdio(false);
int T;
cin >> T;
double R = 6371009;
while(T--){
double lat1,lng1,lat2,lng2;
cin >> lat1 >> lng1 >> lat2 >> lng2;
lat1 = lat1 / 180 * pi;
lng1 = lng1 / 180 * pi;
lat2 = lat2 / 180 * pi;
lng2 = lng2 / 180 * pi;
double lh = R * acos(cos(lat1)*cos(lat2)*cos(lng2-lng1) + sin(lat1)*sin(lat2));
// cout << lh << endl;
double theta = lh / R;
theta /= 2;
// cout << theta << endl;
double l = R * sin(theta) * 2;
cout << fixed << setprecision(0) << lh - l << endl;
}
}
Thank you for your support!