Python中的Voronoi Tessellation

时间:2011-11-29 17:06:41

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

节点分配问题

enter image description here

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

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

另外请建议我是否有更好的方法进行此细分(除了Voronoi曲面细分)。我不确定聚类算法是否是一个不错的选择。我是一个编程新手。

6 个答案:

答案 0 :(得分:7)

以下是使用Voronoi曲面细分的另一种方法:

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

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

答案 1 :(得分:2)

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

https://github.com/Softbass/py_geo_voronoi

答案 2 :(得分:1)

图表中的分数不多。这表明,对于每个需求节点,您可以遍历所有源节点并找到最近的节点。

也许这就是:

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

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

这不是特别有效,但它非常简单!

答案 3 :(得分:1)

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

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

Voronoi Diagram

答案 4 :(得分:1)

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

此外,你还问过有没有比财富算法更容易的替代方案,而且我引用你的特定问题:Easiest algorithm of Voronoi diagram to implement?

答案 5 :(得分:0)

你没有说你为什么要避开Fortune的算法。我认为你的意思是你不想自己实现它,但它已经由Bill Simons和Carston Farmer在脚本中实现,因此计算voronoi图应该不难。

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

enter image description here