二维qhul-voronoi补丁数据的问题



我正在尝试为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 7Matlab版本R2010APython 2.7

实际上,我使用Python的子流程模块来运行DOS shell命令,直接从Qhull中获取值。该部分如下:

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

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

注意:我不能发布图片。显然,这是一个"声誉"问题。如果你想看图片,请随时询问。。。

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

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

最新更新