Lio*_*gan 8

我们将从一些假设开始:

  • 我们将地球形状建模为扁球体.
  • "线"是指大圆的小弧.
  • 我们正在寻找一种高度准确的解决方案(适用于建议的型号)

所以,改写你的问题:

给定三个地球表面点 - p0,p1和p2,在由p1和p2定义的大圆的小弧上找到一个地表点,它最接近p0.

作为解决方案的基础架构,我们需要:

  • 基于初始点,初始方位角和距离找到目标点的精确函数.
  • 测量两点之间距离的精确函数.

我建议分别使用GeographicLib的Direct和Inverse功能,这是我所知道的最准确的实现.

由于扁球体计算中涉及的数学是高度非线性的,我们将构建一个迭代解决方案.

作为第一步,我们将尝试理解一个图表,其中X轴是由p1和p2定义的大圆的次弧上的点,而Y轴是从p0到该点的距离 - 可能看起来喜欢:

这种图形如何看起来有几种选择:函数可以单调递增或单调递减.它也可能包含单个点,其一阶导数可能为0.它可能是最小值(非常微不足道),但也可能是最大值(例如 - 如果Lat(p0)= 0,则Lat(p1)= 100和Lat(p2)= - 100).但是,在所有情况下,导数变化符号都有0或1个点.

理解这一点,我们现在可以构建一个迭代算法.在每次迭代中:

我们将计算dist(p0,p1),dist(p0,p2)以及dist(p0,pM),其中M是由p1和p2定义的大圆的小弧上的p1和p2之间的中点.现在.我们会检查:

  • if(dist(p0,p1)<= dist(p0,pM))&&(dist(p0,pM)<= dist(p0,p2)) - p0比p2更接近p1
  • if(dist(p0,p2)<= dist(p0,pM))&&(dist(p0,pM)<= dist(p0,p1)) - p0比p1更接近p2
  • if(dist(p0,p1)<= dist(p0,p2))&&(dist(p0,p2)<= dist(p0,pM)) - p0是p1
  • if(dist(p0,p2)<= dist(p0,p1))&&(dist(p0,p1)<= dist(p0,pM)) - p0是p2

否则,我们无法确定最小值是否接近p1或p2,因此我们将再使用两个点进行检查:我们将pL定义为p1和pM之间的中点,并将pN定义为pM和p2之间的点.现在,

  • if(dist(p0,pL)<= dist(p0,pM)) - p0更接近p1
  • if(dist(p0,pN)<= dist(p0,pM)) - p0更接近p2

否则 - p0在pL和pN之间.

因此,在每次迭代中,我们将弧长减半,我们正在寻找解决方案.

使用这种方法,我们可以在不到30次迭代中获得1 cm的精度.