在图中查找最近的边

时间:2013-11-10 17:13:59

标签: algorithm geometry computational-geometry graph-algorithm

我想在图表中找到最近的边缘。请考虑以下示例: yellow: vertices, black: edges, blue: query-point

图1: 黄色:顶点,黑色:边缘,蓝色:查询点

一般信息: 该图包含 1000万个顶点 1500万个边。每个顶点都有坐标。边缘由两个相邻的顶点定义。

最简单的解决方案: 我可以简单地计算从查询点到图中每个其他边缘的距离,但这将非常慢。

想法和困难: 我的想法是使用一些空间索引来加速查询。我已经实现了一个kd树来找到最近的顶点。但是如图1所示,入射到最近顶点的边缘不一定最接近查询点。我会得到边缘 3-4 而不是更近的边缘 7-8

问题: 是否有算法在图中找到最近的边?

5 个答案:

答案 0 :(得分:3)

有空间查询结构适用于除点之外的其他类型的数据。最常见的是“R树”结构(及其许多变体),它允许您存储线段的边界矩形。然后,您可以从查询点向外搜索,检查边界矩形中的线段,并在最近的剩余矩形远远超过到目前为止遇到的最近线时停止。当有许多长线段重叠时,这可能会导致性能不佳,但对于PSLG,例如你似乎在这里,这不应该发生。

另一种选择是使用片段来定义BSP树,并从您的点向外扫描以找到所有“可见”线。如果你的观点可以看到许多边缘,这反过来会有问题。

答案 1 :(得分:3)

一个非常简单的解决方案(但可能不是复杂度最低的解决方案)是根据边界框对所有边使用quad tree。然后,您只需提取最接近查询点的边集,并迭代它们以找到最近的边。

四叉树返回的提取边集应该比原始的1500万边缘小很多因素,因此迭代的成本要低得多。

四叉树是比R树更简单的数据结构。它很常见,应该可以在许多环境中随时使用。例如,在Java中,JTS Topology Suite具有可以轻松包装以执行此任务的结构QuadTree

答案 2 :(得分:1)

您可以计算voronoi图并在每个voronoi单元格上运行查询。您可以细分voronoi图以获得更好的结果。您可以组合度量标准和voronoi图表:http://www.cc.gatech.edu/~phlosoft/voronoi/

答案 3 :(得分:1)

没有证据:
您从constrained Delaunay Triangulation开始,这是一个将现有边缘考虑在内的三角测量。例如。 CGALTriangle可以执行此操作。对于每个查询点,您可以确定它属于哪个三角形。然后你只需检查触摸该三角形一角的边缘。
我认为这应该适用于大多数情况,但肯定存在失败的极端情况,例如:当有许多顶点没有任何边缘时,至少你必须删除那些空顶点。

答案 4 :(得分:0)

你可以在长边插入额外的顶点,以便根据最近的顶点得到一些近似值。