我正在尝试使用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]
,但仍然不是完整的边界集。
有人可以告诉我一个正确的解决办法吗?
答案 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值,并将它们与三角测量结果一起绘制,结果