凸包(Convex Hull)是一个计算几何(图形学)中的概念,简单的来说就是对于一个给定的点集,我们需要求得一个凸多边形把给定的点集全部包含起来。
先附上我的结果:
如上图可以看到用绿色的线连成的一个凸多边形,就是一个凸包,它包含点集中所有的点。
一、算法流程
1、求出点集中满足min(x-y)、min(x+y)、max(x-y)、max(x+y)的四个点,并按逆时针(或者顺时针)方向组成一个点的链表。这4个点是离散点中与包含离散点的外接矩形的4个角点最近的点。这4个点构成的多边形作为初始凸包。
2、对于每个凸包上的点I和他的后续点为J,计算矢量线段IJ右侧的所有点到IJ的距离(若顺时针链表则计算左侧的点),求出距离最大的点K。
3、若存在K,则将K插入I到I之后 、J之前, 并将K赋给J(即更新矢量线段IJ = IK)。
4、重复2、3步,直到点集中没有在线段IJ右侧的点为止。
5、将J赋给I,J取其后续点,重复2、3、4步。
6、当凸包中任意相邻两点连线的右侧不存在离散点时,结束点集凸包求取过程。
二、我的实现
void