我正在尝试为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()
但是,这部分工作正常。我已经证实了这一点。
注意:我无法发布图片。显然这是一个“声誉”的事情。如果你想看图像,请随时问...
答案 0 :(得分:0)
证明最新版本的SciPy包含scipy.spatial module中的voronoi。正如文档所述,它是0.12.0版本中的新功能。现在您可以下载最新版本的Scipy并直接使用此功能。快速注意:这将返回一些顶点,其中无限顶点为-1,并且可能返回空数组,这有点烦人。
不幸的是我仍然不知道如何正确使用Qhull。