【问题标题】:Voronoi Tessellation in PythonPython 中的 Voronoi 曲面细分
【发布时间】:2011-11-29 17:06:40
【问题描述】:

节点分配问题

我要解决的问题是将蓝色节点(源节点)作为给定输入点的地图进行细分,一旦我能够做到这一点,我想看看有多少黑色节点(需求节点)属于每个单元格并将其分配给与该单元格关联的蓝色节点。

我想知道是否有更简单的方法可以在不使用 Fortune 算法的情况下执行此操作。我在 Mahotas 下遇到了这个名为 Mahotas.segmentation.gvoronoi(image)source 的函数。但我不确定这是否能解决我的问题。

如果有更好的分割方法(除了 Voronoi 镶嵌),请建议我。我不确定聚类算法是否是一个不错的选择。我是一个编程新手。

【问题讨论】:

  • 关于您的第一个问题(关于 Mahotas.segmentation.gvoronoi):您尝试过吗?结果如何?
  • 这是一个图像处理函数。我尝试在没有 DN(黑色节点)的情况下进行镶嵌,并为源节点提供多种颜色(而不仅仅是蓝色)。我得到了类似于link 的分段
  • 此站点进行节点分配:vpartition.meteor.com

标签: python algorithm computational-geometry voronoi operations-research


【解决方案1】:

这是使用 Voronoi 细分的另一种方法:

在源节点上构建一个 k-d 树。然后对于每个需求节点,使用 k-d 树找到最近的源节点,并增加与该附近源节点关联的计数器。

http://code.google.com/p/python-kdtree/ 找到的 k-d 树的实现应该很有用。

【讨论】:

  • 谢谢!我会研究这个方法。
  • 你也可以使用SciPy中的kdtree (scipy.spatial.kdtree)
  • @wye.bee 我使用了您建议的 k-d 树方法,它帮助我解决了这个问题以及它的其他实例。尽管我可以看到这个算法的使用,但我无法直观地掌握它是如何工作的。您是否推荐任何可能有帮助的书籍或教程。
  • 维基百科是一个很好的起点(注意它的底部还有更多相关材料的链接)。 en.wikipedia.org/wiki/K-d_tree
【解决方案2】:

我一直在寻找同样的东西,发现了这个:

https://github.com/Softbass/py_geo_voronoi

【讨论】:

    【解决方案3】:

    您的图表中没有多少点。这表明,对于每个需求节点,您只需遍历所有源节点并找到最近的一个。

    也许是这样的:

    def distance(a, b):
        return sum((xa - xb) ** 2 for (xa, xb) in zip(a, b))
    
    def clusters(sources, demands):
        result = dict((source, []) for source in sources)
        for demand in demands:
            nearest = min(sources, key=lambda s: distance(s, demand))
            result[nearest].append(demand)
        return result
    

    此代码将为您提供一个字典,将源节点映射到所有需求节点的列表,这些节点比任何其他节点都更接近该源节点。

    这不是特别有效,但是很简单!

    【讨论】:

    • 感谢 Paul,但这只是一个较小的实例,我还将处理更大的实例。
    【解决方案4】:

    我认为https://stackoverflow.com/users/1062447/wye-bee(例如kd-tree)的空间索引答案是解决您问题的最简单方法。

    此外,您还问过财富算法是否有更简单的替代方案,对于这个特定问题,我建议您:Easiest algorithm of Voronoi diagram to implement?

    【讨论】:

      【解决方案5】:

      在 Mathematica 中运行此代码。太壮观了! (是的,我知道它不是 Python,但是……)

      pts3 = RandomReal[1, {50, 3}];
      ListDensityPlot[pts3, 
          InterpolationOrder -> 0, ColorFunction -> "SouthwestColors", Mesh -> All]
      

                

      【讨论】:

        【解决方案6】:

        您没有说明为什么要避免使用 Fortune 算法。我假设您的意思是您只是不想自己实现它,但是 Bill Simons 和 Carston Farmer 已经在脚本中实现了它,因此计算 voronoi 图应该不难。

        在他们的脚本的基础上,我使它更易于使用,并以 Pytess 的名称将其上传到 PyPi。因此,您可以使用基于蓝色点的 pytess.voronoi() 函数作为输入,返回原始点及其计算的 voronoi 多边形。然后你必须通过多边形测试来分配每个黑点,你可以基于http://geospatialpython.com/2011/08/point-in-polygon-2-on-line.html

        【讨论】:

          猜你喜欢
          • 2013-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多