问题描述
我有一个二维点 x,y 的列表。我需要为上下边缘找到一条平滑的曲线(相应的红色和蓝色曲线)。 见下图:a TUI
Enter start number : 2
Enter stop number : 5
2 x 1 = 2 3 x 1 = 3 4 x 1 = 4 5 x 1 = 5
2 x 2 = 4 3 x 2 = 6 4 x 2 = 8 5 x 2 = 10
2 x 3 = 6 3 x 3 = 9 4 x 3 = 12 5 x 3 = 15
2 x 4 = 8 3 x 4 = 12 4 x 4 = 16 5 x 4 = 20
2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25
2 x 6 = 12 3 x 6 = 18 4 x 6 = 24 5 x 6 = 30
2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35
2 x 8 = 16 3 x 8 = 24 4 x 8 = 32 5 x 8 = 40
2 x 9 = 18 3 x 9 = 27 4 x 9 = 36 5 x 9 = 45
2 x 10 = 20 3 x 10 = 30 4 x 10 = 40 5 x 10 = 50
2 x 11 = 22 3 x 11 = 33 4 x 11 = 44 5 x 11 = 55
2 x 12 = 24 3 x 12 = 36 4 x 12 = 48 5 x 12 = 60
现在点云是黑色的。蓝线是从上面的算法中获得的。 Here
更新:
起点和终点可以选择最左边的点(或者手动没问题)
我期待以下结果:
解决方法
您可以使用以下事实(请参阅 scipy.spatial.Delaunay
documentation)
“对于二维,三角形点是逆时针方向的”。
因此,在 Alpha 形状中构建的外边缘点将始终逆时针方向,即形状的内侧将在其左侧(如果文档中未证明这一点,我们可以自己检查并在必要时翻转,但是这里不需要)。
这意味着沿多边形的最左边点和最右边点之间的点是下壳,最右边和最左边之间的点是上壳。下面的代码实现了这个想法。
min_x_ind = np.argmin(edge_points[:,0])
max_x_ind = np.argmax(edge_points[:,0])
if min_x_ind < max_x_ind:
lower_hull = edge_points[min_x_ind:max_x_ind+1,:]
upper_hull = np.concatenate([edge_points[max_x_ind:,:],edge_points[:min_x_ind+1,:]])
else:
upper_hull = edge_points[max_x_ind:min_x_ind+1,:]
lower_hull = np.concatenate([edge_points[min_x_ind:,edge_points[:max_x_ind+1,:]])
结果可以通过以下方式可视化:
plt.plot(upper_hull[:,0],upper_hull[:,1],"r",lw=3)
plt.plot(lower_hull[:,lower_hull[:,"b",lw=3)