uva 11817 大地坐标系
2016-03-03 20:30
204 查看
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { double r = 6371009; double p = acos(-1.0); int n; double l1,d1,l2,d2; while ( scanf("%d",&n) != EOF ) while ( n -- ) { scanf("%lf%lf%lf%lf",&l1,&d1,&l2,&d2); l1 *= p/180.0; l2 *= p/180.0; d1 *= p/180.0; d2 *= p/180.0; double d = r*sqrt(2-2*(cos(l1)*cos(l2)*cos(d1-d2)+sin(l1)*sin(l2))); printf("%.0lf\n",2*asin(d/(2*r))*r-d); } return 0; }
题目:给出地球上的两个点的经度和纬度,计算两点球面距离和两点的空间距离差。
分析:计算几何、大地坐标系。利用公式可直接解得两点的空间距离:
d = r*sqrt(2-2*(cos(lat1)*cos(lat2)*cos(lon1-lon2)+sin(lat1)*sin(lat2)))
推导过程如下:
如图,C,D为已知两点则有如下推导:
AB = r*cos(lat1);DE = r*cos(lat2);BE = r*sin(lat1) + r*sin(lat2);
AD*AD = BE*BE + (AB-DE)*(AB-DE) = 2*r*r - 2*r*r*sin(lat1)*sin(lat2) - 2*r*r*cos(lat1)*cos(lat2);
AC*AC = 2*AB*AB - 2*AB*AB*cos(lon1-lon2) = 2*r*r*cos(lat1)*cos(lat1)*(1-cos(lon1-lon2));
DF*DF = 2*DE*DE - 2*DE*DE*cos(lon1-lon2) = 2*r*r*cos(lat2)*cos(lat2)*(1-cos(lon1-lon2));
AC*DF = 2*r*r*cos(lat1)*cos(lat2)*(1-cos(lon1-lon2));
由托勒密定理有 AC*DF + AD*AD = CD*CD 整理有:
CD = r*sqrt(2-2*(cos(lat1)*cos(lat2)*cos(lon1-lon2)+sin(lat1)*sin(lat2)));
注意:输出最近的整数,%.0lf即可。
转载来自:http://blog.csdn.net/mobius_strip/article/details/12643465
相关文章推荐
- String、StringBuilder、StringBuffer的区别
- K-means:如何选择K(cluster的数目)
- 类目(分类)
- 《leetCode》:Binary Tree Postorder Traversal
- ConcurrentHashMap之实现细节
- 【数据库】 SQL语言练习
- 杭电2051——Bitset
- 80X86寄存器介绍
- 【C++学习之路】派生类的构造函数(一)
- linux patch中的p0和p1的区别
- poj 3436 最大流的增广路算法
- html代码加密的方法有哪些
- SPOJ QTREE - Query on a tree
- XTU OJ 1209 Alice and Bob 2014(嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛)
- 关于最大流模板的补充说明
- 160303、js加密跟后台加密对应
- 5.leetcode题目13: Roman to Integer
- Javascript、js 查找匹配网页html中图片url
- 【C++】用类实现单向单链表的尾插PushBack(),尾删PopBack(),打印PrintSlist()。
- Android使用Volley上传文件