2D qhull voronoi补丁数据的问题

时间:2013-12-26 01:36:58

标签: python matlab voronoi qhull

我正在尝试为Voronoi补丁编写代码。这适用于Matlab,如下所示:

<!-- language: lang-Matlab -->
z = cat(2, x,y); 
[V, C] = voronoin(z);
for i = 1:length(C)
    if any( C{i} == 1)
        continue
    else
        Cnew = [Cnew, i];
    end
end

for i = 1:length(Cnew)
    xx = V( C{Cnew(i)} , 1);
    yy = V( C{Cnew(i)} , 2);
    disp(i), disp(xx), disp(yy)
    plot(xx,yy, 'Color', 'blue')
end

这实际上就是我想要的!

然而,由于Matlab调用qhull,我想直接使用它,这样我就可以为我的朋友创建一个免费的版本。所以我直接从命令行使用qhull,并使用其输出来进行绘图。这是结果:

现在这显然是错误的。所以获得这个的相关代码如下:

我在命令行上使用的命令(对于同一组数据点)如下:

qvoronoi o QJ Fo < data.txt > output.txt

可以看出,有些顶点不正确,虽然大多数顶点都没问题......

用于此图的代码的松弛部分如下:

for pD in pData:
    if 0 in pD: continue
    pD = pD + [pD[0]]
    x, y = np.array([vData[i] for i in pD]).T
    pl.plot(x,y, color='blue')
pl.show()

这里,pData是“补丁”信息,如下所示:

In [6]: pData[:10]
Out[6]:
[[6, 312, 280, 228, 0, 163, 311],
 [4, 0, 228, 230, 229],
 [8, 0, 100, 101, 20, 21, 19, 70, 163],
 [5, 314, 281, 70, 163, 311],
 [4, 0, 18, 160, 229],
 [4, 282, 19, 70, 281],
 [4, 161, 157, 18, 160],
 [5, 103, 99, 101, 100, 102],
 [6, 101, 20, 76, 75, 37, 99],
 [6, 0, 100, 102, 41, 40, 356]] 

虽然vData是看起来像这样的顶点:

In [7]: vData[:10]
Out[7]:
[[-10.101, -10.101],
 [475.0000000012008, 522.999999964199],
 [465.1459330246624, 450.7368421188263],
 [537.1737804542415, 426.2004572957462],
 [477.2870813371678, 434.0427631710093],
 [484.6180167742115, 54.98463685526782],
 [433.9793388408901, 439.3090909117672],
 [399.2310513506661, 466.2359413331789],
 [417.877358491973, 465.8773584984193],
 [461.9861308542621, 410.6663110455131]]

这些信息显然不正确。我猜这个问题与我调用qhull的方式有关。也许我没有使用正确的旗帜?有人可以对这个问题有所了解吗?

我正在处理的系统的一些规范: Windows 7的 Matlab版R2010A Python 2.7

我实际上使用Python的子进程模块运行DOS shell命令直接从Qhull获取值。那部分内容如下:

# Execute qvoronoi to get the vertices and patches
p = subP.Popen('bin\qvoronoi o %s < %s'%(params, fileName), \
                shell=True, \
                stdout=subP.PIPE, \
                stderr=subP.STDOUT)
lines  = p.stdout.readlines()
retval = p.wait()

但是,这部分工作正常。我已经证实了这一点。

注意:我无法发布图片。显然这是一个“声誉”的事情。如果你想看图像,请随时问...

1 个答案:

答案 0 :(得分:0)

证明最新版本的SciPy包含scipy.spatial module中的voronoi。正如文档所述,它是0.12.0版本中的新功能。现在您可以下载最新版本的Scipy并直接使用此功能。快速注意:这将返回一些顶点,其中无限顶点为-1,并且可能返回空数组,这有点烦人。

不幸的是我仍然不知道如何正确使用Qhull。