使用凸包获取矩形的边界(在python中)

时间:2018-02-02 22:00:31

标签: python scipy convex-hull delaunay

我正在尝试使用scipy.ConvexHull()获取矩形的边界,但它没有这样做。

u=np.linspace(0, 4, 8)
v=np.linspace(5, 10, 8)
u,v=np.meshgrid(u,v)
u=u.flatten()
v=v.flatten()
points2D=np.vstack([u,v]).T


hull = ConvexHull(points2D)
convex_hull_plot_2d(hull)
boundaryList = hull.vertices
print boundaryList

仅提供四个角:[ 0 7 63 56]

使用选项qhull_options="QJ Pp"稍微扰乱点数,如下所示:

 hull = ConvexHull(points2D, qhull_options="QJ Pp")

给出了更多的分数:[62 56 40 8 0 2 6 7 15 23 47 55 63],但仍然不是完整的边界集。

有人可以告诉我一个正确的解决办法吗?

1 个答案:

答案 0 :(得分:3)

凸壳状态的数学definition

  

在数学中,一组X的凸包或凸包络   欧几里德平面或欧几里德空间中的点(或更多   通常,在实际上的仿射空间中是最小的凸起   设置包含X。

包含矩形的最小凸集实际上是您获得的四个角。

要获得边界上的所有点,您可以使用Delaunay triangulation,然后从生成的Delaunay网格中计算凸包,

import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Delaunay

u=np.linspace(0, 4, 8)
v=np.linspace(5, 10, 8)
u,v=np.meshgrid(u,v)
u=u.flatten()
v=v.flatten()
points2D=np.vstack([u,v]).T

tri = Delaunay(points2D)
plt.triplot(points2D[:,0], points2D[:,1], tri.simplices.copy())

boundary = (points2D[tri.convex_hull]).flatten()
bx = boundary[0:-2:2]
by = boundary[1:-1:2]

plt.plot(points2D[:,0], points2D[:,1], 'o')
plt.plot(bx, by, 'rs')

plt.xlim(-1,5)
plt.ylim(4,11)
plt.show()

要在形成三角测量后创建船体,程序将使用tri.convex_hull。这返回形成三角形点的凸包的小平面的顶点。在2D情况下,这些是线条,输出作为一组包含每条线的相邻点出现。请注意,这种方法被认为是低效的,因为除了凸包外,它还需要形成三角剖分。

程序的其余部分为每个点提取x和相应的y值,并将它们与三角测量结果一起绘制,结果

enter image description here