math - 使用勾股定理计算两点之间的距离

标签 math algorithm

<分区>

我想创建一个函数,使用毕达哥定理而不是半正弦大圆公式来计算两对纬度/经度之间的距离。由于这将是相对较短的距离(3 公里),我认为这个假设平坦地球的版本应该没问题。我怎样才能做到这一点?我问了互联网,没有想出任何有用的东西。 :)

谢谢。

编辑:

这是我想出的(似乎可行):

def get_dist(lat0, lng0, lat1, lng1)
  begin
    d_ew = (lng1.to_f - lng0.to_f) * Math.cos(lat0.to_f)
    d_ns = (lat1.to_f - lat0.to_f)
    d_lu = Math.sqrt(d_ew.to_f * d_ew.to_f + d_ns.to_f * d_ns.to_f)
    d_mi = ((2*Math::PI*3961.3)/360)*d_lu
    return d_mi
  rescue Exception => ex
    logger.debug "[get_dist] An exception occurred: #{ex.message}"
    return -1
  end
end

最佳答案

如果您希望所涉及的距离与地球的大小相比较小,则可以使用简单的毕达哥拉斯三角形。

假设您在 (lat0, long0) 并且您想知道以“纬度单位”表示的点 (lat1, long1) 的距离。

水平(EW)距离大致为

d_ew = (long1 - long0) * cos(lat0)

将其乘以 cos(lat0) 以说明在高纬度时经度线靠得更近。

垂直(NS)距离更容易

d_ns = (lat1 - lat0)

所以两点之间的距离是

d = sqrt(d_ew * d_ew + d_ns * d_ns)

您可以针对更严格的任务改进此方法,但这应该足以比较距离。

其实比较距离的话,比较d的平方就可以了,也就是说可以省略sqrt运算。

关于math - 使用勾股定理计算两点之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1664799/

相关文章:

java - 在java中计算具有角度的点的移动

python - 来自多个列表的元素的最小组合,使得所有元素至少出现一次

c - 卡在 c 程序中如何在进程中间停止 scanf

math - 使用 d3 检查三角形高度的逻辑

c++ - 如何计算对此函数的递归调用以及正确的答案是什么?

algorithm - 非线性地将一个连续数据范围映射到另一个

math - 在graphviz中使用符号字体/数学符号

arrays - 在排序数组中找到所有对 (x, y) 使得 x + y < z

mysql - 将试卷中相似的和/问题联系起来

algorithm - 模拟时钟的最短路径算法