问题:设P1(X1,Y1),P2(X2,Y2)……Pn(Xn,Yn)是平面上n个点构成的集合S,求集合S的凸包。
凸包:由平面上n个点组成的集合,其凸包就是包含这些点的最小凸边多边形。
问题分析:采用分治法
划分:设直线P1Pn是经过最左边的点P1和最右边的点Pn的直线,直线P1Pn将集合S划分为两个子集S1,S2。
求解子问题:求集合S1的上包和集合S2的下包。
合并:求解过程中获得凸包的极点,因此无须进行合并操作。
算法:求直线PiPj的上包
输入:按x坐标升序排列n个点的集合S={(Xi,Yi),(X i+1,Y i+1),……(Xj,Yj)}。
输出:凸包的极点。
1.若n=2输出(xi,yi),(xj,yj) 算法结束。
2.令dmax=0,max=i+1。
3.k遍历区间(i+1,j-1),执行以下操作
3.1 点Pk(Xk,Yk)位于直线PiPj上方,d为该点到直线PiPj的距离。
3.2 若d>dmax,则max=k,dmax=d
4.递归求解直线PiPmax和直线PmaxPj的上包
求下包算法与上述算法类似