我正在尝试了解 uber 的 H3 地理索引系统。我理解 _geoToVec3d() 函数,但我坚持使用 _geoToHex2d() 函数。
有谁知道等式在哪里 uber的H3源码中的函数_geoToHex2d()中的
cos(r) = 1 - 2 * sin^2(r/2) = 1 - 2 * (sqd / 4) = 1 - sqd/2
来自于?它描述了什么?
或者也许有人理解方程中的参数r代表什么?
我知道 sqd 是从二十面体面中心到要编码的点的平方距离。在代码的接下来几行中,如果 r 小于 epsilon,则包含该点的单元格的 2D 十六进制坐标将设置为 (0,0)。我推测 r 一定是距面中心的距离,但可能已经在日射投影平面中了?
我不得不承认这是我最不熟悉的H3库的领域,所以对以下解释持保留态度:
我相信,在这个函数的开头,
r
是从被索引的点到最近的二十面体面的中心的弧度距离。线
// cos(r) = 1 - 2 * sin^2(r/2) = 1 - 2 * (sqd / 4) = 1 - sqd/2
double r = acos(1 - sqd / 2);
将单位球面上两点之间的 3d 距离的平方转换为以弧度为单位的距离。该评论使用 双角恒等式
cos(2𝛼) = 1 − 2sin^2(𝛼)
将 cos(r)
表述为 sqd
。
解释
在上图中,单位球体的横截面,到
F->C
的距离是1
,到C->E
的平方距离是sqd
。我们正在尝试找到角度CFE
。
sin^2(r/2)
的值与sin^2(CFd)
相同。由于 sin(CFd) = C->d / 1 = C->d
,sin^2(CFd)
是距离 C->d
的平方。C->d
的距离平方为 (sqrt(sqd) / 2)^2 = sqd / 4
cos(r) = 1 - 2 * sin^2(r/2)
。代入平方距离 C->d
得到 cos(r) = 1 - 2 * (sqd / 4)
,简化为 1 - sqd / 2
。r
求解为 acos(1 - sqd / 2)
对这个有点折磨人的解释表示歉意,因为我不是数学家。如您所见,
r
现在是角度 CFE
,即 C
和 E
之间的弧度距离。稍后在函数中,使用心射投影将其投影到二十面体面的平面空间中,然后使用二维六角坐标定位在该面上的平面六角网格中。