4

我已经实现了decode/encode一种将 2d 点转换为各自的morton code.

我正在寻找的是找到最近的邻居(在 a 下min_distance)所以例如这样的:

points=[(200,300),(500,150),(100,50)]
mortonCodes = {}
for p in points:
    mortonCodes[encode(p)] = p

nearest = findNearestNeighbor(mortonCodes, (201,305))
print(nearest) # ---> should return (200,300)

这可能吗?

4

1 回答 1

4

您可以使用 执行以下操作min_distance,例如 120:使用您的查询点qp=(201,305)并通过减去/添加距离来创建最小和最大点:min=(81, 185)max=(321,425)。现在,为这两个点创建 morton 代码。

在 (210,305) 的 120 距离内的所有点都将具有带有 的 mortonmcWithin120代码mortonCode(min) <= mcWithin120 <= mortonCode(max)。如果您有一个按 morton 代码排序的点列表,这应该会大大缩小搜索区域。

请注意,该范围将包含误报!并非所有在 min 和 max 之间具有 morton 代码的点都在给定的距离 120 内,因此您必须检查范围内的所有点是否“实际上”在正确的距离内。

如果您对空间搜索感兴趣,请查看PH-Tree,它是一种空间索引,类似于四叉树,使用 morton 顺序优化树结构和搜索。

于 2017-05-16T07:15:07.703 回答