我认为scipy.spatial.Delaunay.convex_hull返回一个数组,其中每个点/索引使用两次,因为一个点属于两个边。但就我而言,只有一次有几个指数:
hull = [[5053 6943]
[6219 5797]
[3441 5797]
[7547 1405]
[3441 6547]
[8144 9215]
[ 47 444]
[ 444 6219]
[6547 5053]
[9945 6943]
[2695 1405]]
例如,“47”仅使用一次。这是什么意思(几何上)?如何将凸包的一个点仅用于一个边缘?
答案 0 :(得分:0)
如上面评论中所述,您应该使用较新的scipy.spatial.ConvexHull
。如果你看看下面我的IPython示例中从这个方法返回的顶点的索引,你会发现它们通常不是2D或3D数据集的冗余。
%pylab inline
import numpy
#use a simple trianglular data set:
triangle_points = numpy.array([[0,0],[-1,1],[1,1]])
#plot the triangle:
fig = plt.figure()
ax = fig.add_subplot(111,aspect='equal')
ax.scatter(triangle_points[...,0],triangle_points[...,1])
#now calculate the convex hull of the triangular point set:
import scipy, scipy.spatial
convex_hull_2D = scipy.spatial.ConvexHull(triangle_points)
#determine the indices of the vertices forming the convex hull (i.e., the output you get with the older scipy version):
convex_hull_vertex_indices = convex_hull_2D.vertices
#print the array of convex hull vertex indices:
convex_hull_vertex_indices
array([2, 1, 0], dtype=int32) #output
#For this simple 2D data set it is clear that scipy can define a convex hull using the index of each input point only once, so it is not doing AB, BC, CA as you might initially guess
#Let's see what happens if we add a point outside the plane of the triangle and make the data set 3D:
tetrahedral_points = numpy.array([[0,0,0],[-1,1,0],[1,1,0],[0,0.5,3]]) #the last element is the 'out of plane' new point
convex_hull = scipy.spatial.ConvexHull(tetrahedral_points)
convex_hull_vertex_indices = convex_hull.vertices
convex_hull_vertex_indices
array([0, 1, 2, 3], dtype=int32) #output
#again, for a simple shape, even in 3D, scipy specifies the indices of the vertices of the convex hull in a non-redundant manner
#take a look at the simplices of the 2D ConvexHull object:
convex_hull_simplices = convex_hull_2D.simplices
convex_hull_simplices
array([[2, 1],
[0, 1],
[0, 2]], dtype=int32) #output
#so the simplices do contain duplicate indices to connect points to form edges/1-simplices
fig = plt.figure()
ax = fig.add_subplot(111,aspect='equal')
ax.set_ylim(0,1.2)
edge_colors = ['blue','red','green'] #color each 1-simplex differently for clarity
for simplex, edge_color in zip(convex_hull_simplices,edge_colors):
plt.plot(triangle_points[simplex,0], triangle_points[simplex,1], c=edge_color)