凸面外壳

2024-06-02 11:34:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用scipy(0.10.1)来快速绘制凸面外壳。

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

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]]

数字是顶点索引。我的问题是他们没有订购。我需要他们在CW或CCW的顺序,以便容易地可视化他们在KML。

有什么简单的方法可以让scipy.space计算出正确的顺时针顺序吗?


Tags: 代码顺序绘制数字scipy数组外壳spatial
3条回答

我发现了一个很好的方法,但它需要scipy 0.11.0(sparse.csgraph)

下面是一个完整的例子,实际排序是“sort hull…”注释后面的两个对齐。

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])

所以这段代码似乎起到了作用,但可能更简单。。。 基本上,我首先从外壳收集顶点数。然后我计算平均值,重新将数据集居中,并按与平均值的角度对其进行排序。

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]))]]

^{}的当前dev doc(0.13.0.dev)中,有一个在2D中逆时针的vertices属性

相关问题 更多 >