2013-02-06 36 views
6

我试图用scipy(0.10.1)进行一个快速入侵以可视化凸包。凸壳和SciPy

我可以用下面的代码得到的凸包:

vecs = [[-0.094218, 51.478927], [-0.09348, 51.479364], [-0.094218, 51.478927], 
     ... 
     [-0.094218, 51.478927], [-0.094321, 51.479918], [-0.094218, 51.478927], 
     [-0.094222, 51.478837], [-0.094241, 51.478388], [-0.094108, 51.478116], 
     [-0.09445, 51.480279], [-0.094256, 51.478028], [-0.094326, 51.500511]] 
hull = scipy.spatial.Delaunay(vecs).convex_hull 

所得阵列看起来像这样:

[[56, 9], [16, 1], [56, 1], [55, 9], [53, 55], [53, 16]] 

数字是顶点索引。我的问题是他们没有订购。我需要他们按顺时针或逆时针顺序排列,以便用KML方便地将它们可视化。

是否有任何简单的方法让scipy.spatial计算顺时针顺序?

回答

10

所以这段代码似乎有窍门,但可能会更简单... 本质上,我首先从船体收集顶点数。然后我计算平均值,重新确定数据集,并用平均值的角度对其进行分类。

ps = set() 
for x, y in hull: 
    ps.add(x) 
    ps.add(y) 
ps = numpy.array(list(ps)) 
center = vecs[ps].mean(axis=0) 
A = vecs[ps] - center 
h = vecs[ps[numpy.argsort(numpy.arctan2(A[:,1], A[:,0]))]] 
4

我发现了一个不错的方法,但它需要SciPy的0.11.0(sparse.csgraph)

下面是一个完整的例子,实际的排序是2分法分以下的“之类的船体... “评论。

import numpy as np 
import scipy as sp 

# random point cloud and hull 
X = np.random.randint(0,200,(30,2)) 
hull = sp.spatial.qhull.Delaunay(X).convex_hull 

# sort hull indices using (sparse) adjacency matrix graph stuff 
g = sp.sparse.csr_matrix((np.ones(hull.shape[0]),hull.T), shape=(hull.max()+1,)*2) 
sorted_hull = sp.sparse.csgraph.depth_first_order(g,hull[0,0],directed=False)[0] 

# display with matplotlib 
from matplotlib import pyplot as plt 
plt.plot(X[:,0],X[:,1],'.') 
plt.plot(X[sorted_hull,0],X[sorted_hull,1])