实际上这是一个很简单的问题,今天之所以把他提出来并作出解决方案,是因为昨天在讨论项目的时候,项目lead提出计算地球球面上两点的球面距离是很难的,实际上是一个很简单的立体几何的计算。另一方面,权当作是练习一下C/C++语言,并且锻炼一下自己的设计能力吧。
1. 提出问题
已知球面的两点,为了方便起见,以经纬度来唯一标识点的位置(相关概念请参照2.相关预备知识),要求计算出它们的球面距离。
2. 相关预备知识
这儿提到的预备知识是地球的相关知识,如形状和大小、纬度和经度等相关概念。
(1)形状和大小:
地球形状是一个两极部位略扁的不规则的球体。地球的平均半径为6371千米,赤道半径6378千米,极半径6357千米。赤道周长约为4万千米。
(2)纬线和纬度、经线和经度
① 纬线:纬线都是圆,也称为纬线圈,长度不等。赤道最长,由赤道向两极逐渐缩短,最后成一点。纬线指示东西方向。
② 纬度:赤道是零度纬线。赤道以北的纬度,叫北纬,用“N”作代号;赤道以南的纬度叫南纬,用“S”作代号。北纬、南纬各有90°。
③ 经线:也叫子午线。经线是半圆,所有经线长相等。经线指示南北方向。
④ 经度:零度经线叫做本初子午线。从本初子午线向东、向西各分作180度,以东的180°属于东经,用“E”作代号;以西的180°属于西经,用“W”作代号。
东西180°经线合为一条经线。
用20°W和160°E的经线圈,将地球分为东、西两个半球。
3. 解决方案
如上图,先假设球的半径为R,所给定的2点为A,B两点,先假设A在北半球,B在南半球。这只是其中的一种情况,至于其它的情况可以同样的方法计算出,仅仅是大同小异而已。当然,还有特殊情况也不能忘了哦。
假设球心为点O,那么最后得到的∠AOB的弧度乘以球的半径R即为所求的球面距离。
设经过球的南极和北极的极点的直线为l,分别过点B、A作l的垂线,设垂点分别为D、C。
过点作线BC的平行线,过B作CD的平行线,这两条平行线必定相交,设交点为E,容易证明BDCE是一个矩形。
由于A、B点的经纬度已知,所以∠OBD和∠OAC也已知,设分别为β,α,由于半径R已知,所以|BD| = R * cosβ,|AC| = R * cosα,|OD| = R * sinβ,|OC| = R * sinα。
由于点A、B的经度已知,所以不难求出∠ACE的值。所以三角形ACE中不难用余弦定理求出|AE|的值。
在直角三角形ABE中,容易求出AB的值。此时三角形AOB三条边都已知,所以∠AOB也可以用余弦定理求出来,这样AB的球面距离也迎刃而解了。
呵呵,高一下学期学的立体几何,现在做起来竟然还有点吃力。本来想今天顺便把代码写出来,算了,好晚了,明天再写吧。
睡觉,忽忽!
本文地址:http://com.8s8s.com/it/it23627.htm