问题描述
我有一组具有x和y坐标的点。我想从这些方面构建一个Voronoi图,然后基于该图并遵循以下规则构建一个图:
- 图中的每个区域都将成为图中的节点。
- 如果两个节点的区域在图中相互接触,则将其连接。
如何构建此图?我只需要一个起点,所以我知道从哪里开始。
解决方法
您要查找的图形是Delaunay triangulation,它是Voronoi图的对偶。在此图中,如果相关的Voronoi细胞彼此接触,则节点对应于输入中的点,并且节点在图中/三角连接。
您可以使用scipy.spatial.Delaunay在scipy中构建Delaunay三角剖分。您要查找的数据(哪些顶点相互连接)可通过结果的vertex_neighbor_vertices attribute获得。
>>> import numpy as np
>>> points = np.array([[0,0],[0,1.1],[1,1]])
>>> from scipy.spatial import Delaunay
>>> tri = Delaunay(points)
>>> tri.vertex_neighbor_vertices
(array([ 0,3,5,7,10],dtype=int32),array([2,1,2,1],dtype=int32))
在上面的示例中,图连接性使用两个数组存储:第二个数组包含所有相邻的顶点,第一个数组包含每个数组中对应于每个特定顶点的位置范围。顶点编号:0 = [0,0],1 = [0,1.1],2 = [1,0],3 = [1,1])。然后在结果图中,顶点0连接到顶点2、3和1(在第二个数组中的位置0、1和3),顶点1连接到顶点3和0(顶点2中的n个位置3和4)。第二个数组),顶点2连接到顶点3和0,顶点3连接到顶点2,0和1。
在scipy文档中,三角剖分如下所示:顶点0和3具有三个邻居,另外两个顶点仅具有两个邻居。