在包含点的Voronoi图中有效地找到多边形

时间:2014-07-16 02:53:10

标签: algorithm d3.js voronoi spatial-index

我正在Voronoi diagram投影图像。对于图像的每个非黑色像素,我在图中找到相应的多边形并为其着色。 (The site, to get an idea what I mean.)有几百个多边形,蛮力方法是可行的。只有几千,它不是。

我的问题:如何有效地搜索包含点的多边形的多个多边形?我对一般情况感兴趣,没有对多边形分布或大小做出假设。

enter image description here

现有两个答案(我发现)涉及:

Finding out if a point is inside a voronoi cell它优雅地利用了Voronoi多边形是凸的事实。因此,中心最近的多边形也必须是包含多边形。不幸的是,为了确定最小值,仍然搜索所有多边形。这是不可扩展的。

Finding the polygon in a 2D mesh which contains a point它提到了一个二维间隔树。 (根据这些slides on the topic,它应该是一个分段树。)然而,Voronoi图的一个属性是多边形不重叠,而分段树不做这个假设。因此,如果确实这些树是最佳选择(?),是否有一种方法包括这种假设,使其更有效率?

我使用D3将其构建为纯粹客户端的JavaScript,因此我对算法,库或建模的更改感兴趣。例如,MySQLMongoDB等空间数据库对我没有帮助。


到目前为止我尝试过:我为我的用例建立了一个足够有效的索引,它依赖于我可以做出的假设,见下文。

我特定情况的解决方案基本上是多边形中心点的散列。

构建索引:

  1. 图表分为统一大小的网格。
  2. 每个多边形按其中心点分配给单元格。
  3. 搜索包含给定点的多边形时:

    1. 确定该点的单元格。
    2. 测试此单元格的所有多边形。
    3. 如果没有匹配,则搜索周围的单元格,广度优先,直到找到多边形。
    4. 这很有效,因为我做了一些假设:

      1. 多边形均匀分布。这意味着,均匀的网格很好。统一网格允许通过平移坐标来确定点的单元格。
      2. 多边形是凸的。这意味着中心点实际上接近其大部分区域。
      3. 多边形的大小基本相同。通过选择接近平均多边形大小的单元格大小,很可能直接单元格或其中一个相邻单元格与所需多边形相关联。
      4. 基本上总是有一个包含点的多边形。 (即,在搜索所有细胞时浪费的时间很少。)
      5. 所以,虽然这适用于我的用例,但我想放松一些限制。如果可能,这个问题是关于丢弃假设1和3。 (根据我的理解,给出了Voronoi图的2和4。)

1 个答案:

答案 0 :(得分:0)

如果这不是纯粹的几何问题,那么我会选择查找位图。只需使用颜色的整数ID绘制辅助位图(画布)中的所有多边形。要查找多边形ID,只需检查相应位置的像素颜色即可。一个位置 - 一次取。它应该是超快但不是几何完美的。请注意,您可以缩放查找位图以提高准确性。