Python 确定和存储Voronoi单元邻接

Python 确定和存储Voronoi单元邻接,python,graph,geometry,computational-geometry,voronoi,Python,Graph,Geometry,Computational Geometry,Voronoi,我将使用一组数千个点。我可以实现或使用Fortunes算法的现有实现来生成点的Voronoi图,但我的应用程序还要求我知道每个Voronoi单元的邻接关系 更具体地说,对于任何Voronoi细胞,我需要知道与之相邻的细胞。在这一点上,我不关心输出或存储方法,因为我可能会对实现进行按摩,使其对我有利 是否有人知道一种算法,或者更好的是知道一种可以完成单元邻接确定的实现算法?我将要做的工作是在python中,但任何东西都将是伟大的,因为我可以轻松地翻译代码 谢谢 有一种可能的算法可用 它使用线性规划

我将使用一组数千个点。我可以实现或使用Fortunes算法的现有实现来生成点的Voronoi图,但我的应用程序还要求我知道每个Voronoi单元的邻接关系

更具体地说,对于任何Voronoi细胞,我需要知道与之相邻的细胞。在这一点上,我不关心输出或存储方法,因为我可能会对实现进行按摩,使其对我有利

是否有人知道一种算法,或者更好的是知道一种可以完成单元邻接确定的实现算法?我将要做的工作是在python中,但任何东西都将是伟大的,因为我可以轻松地翻译代码


谢谢

有一种可能的算法可用 它使用线性规划方法

纸浆可以生成MPS或LP文件并调用、、和来解决线性问题


是一个用Python编写的LP建模器,可用于用Python对该线性程序建模,然后使用

您可以用几种不同的方法来实现这一点

如果您刚刚可以访问Voronoi图,则可以查找单元之间的共享边段。如果发现两个单元共享一个Voronoi边段,则表示它们相邻。为整个数据集建立邻接信息的一种有效方法是通过扫描Voronoi单元列表来建立边的哈希表

for (all cells in voronoi diagram)
    for (all edges in current cell)
        if (matching edge found in hash table)
            // the current cell is adjacent to the cell that added
            // the matching edge segment to the hash table
        else
            // push current edge segment onto hash table and mark with 
            // current cell index
        endif
    endfor
endfor
有许多好的现有软件包可用于计算点集的Voronoi图/Delaunay三角剖分。由于这是一个计算成本高且数字敏感的操作,我建议使用现有的库。产品和包装广泛使用


希望这能有所帮助。

虽然这是一个老问题,但我一直在寻找同样的问题,并认为答案可能对某些人仍然有帮助。可以使用
scipy
模块中的
Delaunay

from scipy.spatial import Delaunay
from collections import defaultdict
import itertools

points=[[0.0, 0.0], [0.0, 1.0], [0.2, 0.5], [0.3, 0.6], [0.4, 0.5], [0.6, 0.3], [0.6, 0.5], [1.0, 0.0], [1.0, 1.0]]
tri = Delaunay(points)
neiList=defaultdict(set)
for p in tri.vertices:
    for i,j in itertools.combinations(p,2):
        neiList[i].add(j)
        neiList[j].add(i)

for key in sorted(neiList.iterkeys()):
    print("%d:%s" % (key,','.join([str(i) for i in neiList[key]])))

0:1,2,5,7
1:0,8,2,3
2:0,1,3,4,5
3:8,1,2,4,6
4:2,3,5,6
5:0,2,4,6,7
6:8,3,4,5,7
7:8,0,5,6
8:1,3,6,7
   
# This is for visualization
from scipy.spatial import Voronoi, voronoi_plot_2d
import matplotlib.pyplot as plt
vor = Voronoi(points)
voronoi_plot_2d(vor)
for i,p in enumerate(x):
    plt.text(p[0], p[1], '#%d' % i, ha='center')
plt.show()

非常有用。但值得强调的是,沃罗诺图的这种可视化在边界上可能会产生误导。例如,节点#0与#1和#7相邻,但图中没有显示这一点。谢谢您的回答。为什么要使用
defaultdict
?这与常规的
{}
有何不同?