要求:地球的平均半径为6371千米,已知地球上两个城市A、B的经度和纬度,编程序求出这两个城市之间的地面距离。

首先,固定两点,a(x1,y1,z1),b(x2,y2,z2)。

由空间解析几何及向量知识知:

其中,theta是两向量夹角,球面距离d:

对于A点来说(图中a应改为A,画图的时候写错了),

theta就是A点的纬度值,即:

也即:

而对于A点的x,y坐标,首先:

r1是小圆的半径,也就是下图中的蓝色圆:

请注意平面图与立体图中坐标的对应,我已一一对应好,注意观察。

图中的alpha即:

所以,坐标与经度之间有如下关系:

实际的北极点是这样的:

还有一点,东西经南北纬转化问题。

关于东西经和南北纬,在上面的阐述中,东经的点的y值都是正值,西经的点的y值都是负值,北纬的点的z值都是正值,南纬的点的z值都是负值。因为如下图,地球被分为了东北半球,东南半球,西北半球,西南半球:

如上分析,不难写出如下代码:

#include

#include

#include

#include

#include

using namespace std;

#define pi 3.1415926535

#define radio 6378137.0

//defining a new struct for the convenience of calculating

typedef struct

{

long double Longitude;

long double Lantitude;

string East_or_West;

string North_or_South;

} dot;

//function for calculating

int Distance(float lat1, float lon1, float lat2, float lon2)

{

double latitude1,longitude1,latitude2,longitude2;

double dlat,dlon;

latitude1=lat1;

longitude1=lon1;

latitude2=lat2;

longitude2=lon2;

//computing procedure

double a,c,distance;

dlon =fabs((longitude2 - longitude1))*pi/180;

dlat =fabs((latitude2 - latitude1))*pi/180;

a = (sin(dlat/2)*sin(dlat/2)) + cos(latitude1*pi/180) * cos(latitude2*pi/180) * (sin(dlon/2)*sin(dlon/2));

if(a==1.0)

c=pi;

else

c = 2 * atan(sqrt(a)/sqrt(1-a));

distance= radio*c;

return distance;

}

int main()

{

long double r = 6371.004;

dot a, b;

//freopen("D:\example.txt","r",stdin);

while(1)

{

cout<

cout<

//data input procedure

cin>>a.East_or_West>>a.Longitude>>a.North_or_South>>a.Lantitude;

cin>>b.East_or_West>>b.Longitude>>b.North_or_South>>b.Lantitude;

//transfer

{

if(a.East_or_West == "East")

{

a.Longitude = a.Longitude;

}

else if(a.East_or_West == "West")

{

a.Longitude = - a.Longitude;

}

}

{

if(a.North_or_South == "North")

{

a.Lantitude = pi / 2 - a.Lantitude;

}

else if (a.North_or_South == "South")

{

a.Lantitude = pi / 2 + a.Lantitude;

}

}

{

if(b.East_or_West == "East")

{

b.Longitude = b.Longitude;

}

else if(a.East_or_West == "West")

{

b.Longitude = - b.Longitude;

}

}

{

if(a.North_or_South == "North")

{

b.Lantitude = pi / 2 - b.Lantitude;

}

else if (a.North_or_South == "South")

{

b.Lantitude = pi / 2 + b.Lantitude;

}

}

//data output procedure

float result = Distance(a.Lantitude, a.Longitude, b.Lantitude, b.Longitude);

cout<

}

}

可能有所纰漏,因为第一遍写代码的时候没这么仔细分析。

想要更深层次了解此问题,请参看微分几何中关于测地线及测地线曲率的相关问题。

欲证明该思想的正确性,可以采取如下反证法:

假设通过二点存在一个小圆对应的劣弧长比球面距离小,那条曲线未必是平面曲线,所以未必是圆弧。

java 球面距离_[置顶] C语言实验题:已知地球上两点的经度和纬度求其球面距离...相关推荐

  1. [置顶] C语言实验:输入任意一个日期的年、月、日的值,求出从公元1年1月1日到这一天总共有多少天,并求出这一天是星期几。...

    要求:输入任意一个日期的年.月.日的值,求出从公元1年1月1日到这一天总共有多少天,并求出这一天是星期几. 简单的循环结构,并结合基姆拉尔森公式,注意月份转换. 下面是源码,仅供参考: #includ ...

  2. 求直角边的斜边c语言,使用多种程序语言编程:已知斜边与一直角边,通过勾股定理求另外一直角边,50分起价,多一个正确回答加100分(并非刷分,请不要误解)...

    满意答案 zhjp0412 2014.08.10 采纳率:40%    等级:9 已帮助:214人 common lisp版(刚学的,献丑了- -): (defun gougu(x y) (setq ...

  3. c语言已知三点的坐标,求一个C语言算法:已知三角形的三个顶点的坐标,求三角形面积...

    共回答了16个问题采纳率:87.5% //三个顶点坐标是6个参数. #include #include double S_triangle(double ax,double ay,double bx, ...

  4. Java怎么做置顶_[Java教程]自定义置顶TOP按钮

    [Java教程]自定义置顶TOP按钮 0 2015-12-10 22:00:13 简述一下,分为三个步骤: 1. 添加Html代码2. 调整Css样式3. 添加Jquery代码具体代码如下: #GoT ...

  5. C语言编程b a化简,C语言编程,已知三角形的三边长a,b,c,计算求三角... 如果三角形三边长 a,b,c,满足( )那么这个三角形......

    导航:网站首页 > C语言编程,已知三角形的三边长a,b,c,计算求三角... 如果三角形三边长 a,b,c,满足( )那么这个三角形... C语言编程,已知三角形的三边长a,b,c,计算求三角 ...

  6. Java 通过具体位置,获取对应地图上的坐标: 经度、纬度

    import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.MalformedURLExcepti ...

  7. c语言编程题输入两个直角边,C语言编程 直角三角形已知两边求第三边

    C语言编程题 求大神解答 好久没写C了,不知道对不对:intsum=0;intindex=0;for(;indexsum+=a[2][index];}returnsum; C语言编程题,求分段函数 刚 ...

  8. setwindowpos怎么改变z序_置顶窗口SetWindowPos()的用法

    置顶窗口 SetWindowPos() 的用法 SetWindowPos () 函数功能:该函数改变一个子窗口,弹出式窗口式 顶层窗口的尺寸,位置和 Z 序.子窗口,弹出式窗口,及顶 层窗口根据它们在 ...

  9. 堰流实验报告思考题_宽顶堰流实验.doc

    宽顶堰流实验 非均匀流水面曲线 实验报告 课程名称:水力学 姓 名: 专业班级: 小 组: 学 号: 同 组 人: 指导教师: 实验日期: 华北电力大学(北京) 可再生能源学院 一.实验目的 1. ...

最新文章

  1. RocketMQ CommitLog And Index
  2. NavigationDrawer和NavigationView-Android M新控件
  3. 简明python教程 --C++程序员的视角(三):模块
  4. 网络基础知识——以太网
  5. nexus私服搭建及maven生命周期
  6. ASP.NET MVC 2.0 AsyncController(转)
  7. 杭电2027--统计元音
  8. 使用adb命令从Android手机中取出已安装的app包,导出apk
  9. 详解手机注册验证码操作思路与流程
  10. QQ群发精灵V3.2
  11. 《数据结构》第十篇、线性表中的链式存储结构--双链表
  12. win2008 r2折腾php7.1记录
  13. [译]为什么苹果眼镜会没有ARKit——当前AR产品的8大问题
  14. 极客日报:微信正式宣布开放外部链接;iPhone13预购开启导致苹果官网崩了;特斯拉将向车主提供新版 FSD
  15. 菜鸟的AI安全乱谈(2)—通过模型再训练留后门
  16. weui组件库的下载及使用
  17. 学编程要什么基础,零基础呢?
  18. uml 符号关系示意
  19. zig语言代替C语言进行裸机开发的尝试-2023年笔记
  20. 计算机毕业设计Python+uniapp驾校预约系统小程序(小程序+源码+LW)

热门文章

  1. C++ Primer 5th笔记(chap 16 模板和泛型编程)定义
  2. 石墨烯区块链(2)核心功能
  3. 区块链BaaS云服务(19)趣链Hyperchain
  4. 区块链BaaS云服务(17)纸贵科技Z-BaaS零知识证明
  5. (chap2 简单的Http协议) 请求报文和响应报文
  6. Linux中如何安装MySQL详细步骤
  7. optee中core_init_mmu_regs函数解读
  8. 通过系统调用open来查看flag
  9. recyclerview滑动到顶部和底部监听+上滑下滑监听
  10. 9.任务段(TSS)