Scipy 的 voronoi 算法中的 -1 是什么意思?

joh*_*ual 2 python graphics voronoi scipy computational-geometry

我正在尝试自定义绘制二维中随机点的Voronoi区域

import matplotlib.pyplot as plt
%matplotlib inline

from scipy.spatial import Voronoi
pt = np.random.random((10,2))
x = sp.spatial.Voronoi(pt)

# trial an error to figure out the type structure of [x]

plt.plot(x.vertices[:,0], x.vertices[:,1], '.', markersize=5)

# how to iterate through the x.regions object?
for poly in x.regions:
    z = np.array([ x.vertices[k] for k in poly])
    print z
    if z.shape[0] > 0:
        plt.plot( z[:,0], z[:,1])

plt.xlim([0,2])
plt.ylim([0,2])
Run Code Online (Sandbox Code Playgroud)

为什么区域重叠?绘制无限区域的任何建议?

在此处输入图片说明


数据点只是随机数:

x.vertices

array([[ 0.59851675,  0.15271572],
       [ 0.24473753,  0.70398382],
       [ 0.10135325,  0.34601724],
       [ 0.42672008,  0.26129443],
       [ 0.54966835,  1.64315275],
       [ 0.24770706,  0.70543002],
       [ 0.39509645,  0.64211128],
       [ 0.63353948,  0.86992423],
       [ 0.57476256,  1.4533911 ],
       [ 0.76421296,  0.6054079 ],
       [ 0.9564816 ,  0.79492684],
       [ 0.94432943,  0.62496293]])
Run Code Online (Sandbox Code Playgroud)

地区按编号列出

x.regions

[[],
 [2, -1, 1],
 [3, 0, -1, 2],
 [5, 1, -1, 4],
 [6, 3, 2, 1, 5],
 [11, 9, 7, 8, 10],
 [8, 4, 5, 6, 7],
 [9, 0, 3, 6, 7],
 [10, -1, 4, 8],
 [11, -1, 0, 9],
 [11, -1, 10]]
Run Code Online (Sandbox Code Playgroud)

由此我们可以重新构建情节。我的问题是什么-1意思?

Leo*_*eon 5

scipy.spatial.Voronoi下面使用 Qhull 库。根据我的经验,Qhull 包含几个可用性错误。你击中了其中之一

qvoronoi 输出

Voronoi 顶点

[...]

FN:列出每个 Voronoi 区域的 Voronoi 顶点。第一行是 Voronoi 区域的数量。剩余的每一行都以 Voronoi 顶点的数量开始。负索引(例如,-1)表示 Voronoi 图之外的顶点。



为什么区域重叠?

因此,-1在第一个 Voronoi 区域中,[2, -1, 1]fromx.regions代表一个无穷大的顶点未在 中表示 x.vertices)。然而,当您使用x.vertices该虚假索引进行访问时,您将获得最后一个顶点。这发生-1在你的每一个x.regions(注意那些 -1 表示不同的无穷大顶点)。因此,您会得到从 连接到最后一个顶点的虚假 Voronoi 边x.vertices

绘制无限区域的任何建议?

你为什么不简单地使用scipy.spatial.voronoi_plot_2d()