我想要解决的问题是将蓝色节点(源节点)给出的地图镶嵌为给定的输入点,一旦我能够这样做,我想看看有多少黑节点(需求节点)落入其中每个单元格并将其分配给与该单元格关联的蓝色节点。
我想知道在没有使用Fortune算法的情况下是否有更简单的方法。我在Mahotas下遇到了这个函数,名为Mahotas.segmentation.gvoronoi(image)source。但我不确定这是否能解决我的问题。
另外请建议我是否有更好的方法进行此细分(除了Voronoi曲面细分)。我不确定聚类算法是否是一个不错的选择。我是一个编程新手。
答案 0 :(得分:7)
以下是使用Voronoi曲面细分的另一种方法:
在源节点上构建k-d树。然后,对于每个需求节点,使用k-d树查找最近的源节点,并增加与该附近源节点关联的计数器。
在http://code.google.com/p/python-kdtree/找到的k-d树的实现应该是有用的。
答案 1 :(得分:2)
我一直在寻找相同的东西并发现了这个:
答案 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]
答案 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。