问题:在二维平面上,给定一些带有坐标位置的点,如何获取包含所有这些点的最小凸边形?
该问题就是在二维平面上求凸包(Convex Hull)。
如下图,图中给定了一些点,外围连线所围成的凸边形刚好将所有给定的点包围起来。
如果我们将这些点和凸边形放到一个二维平面坐标系中观察。
我们可以发现,在这些点中,沿着横坐标方向上,x坐标值最大和最小的点一定在凸包上,同样的,沿着纵坐标方向上,y坐标值最大和最小的点也一定在凸包上。因为这本身就是凸包所定义的,凸包是最外围的一圈点,所以最外围的点必然是各个方向上的极值。
接着,从A点上观察,所给定集合的点都在AD边的一侧,也都在AB边一侧。同样的,凸包上的点都满足这个要求。这个特点,我们可以怎么利用呢?
我们先通过角度来利用。
以A点为例,边AB与x轴正方向所形成的角是集合中所有点与A所形成的边与x轴正方向所形成的的所有角中最小的,边AE与x轴正方向所形成的角是集合中所有点与A所形成的边与x轴正方向所形成的的所有角中最大的。
通俗一点描述,从A点出发,沿着平行与x轴的方向画一条射线,该射线围着点A逆时针转动,那么点B就是该条射线第一个碰到的点,点E是这条射线最后一个碰到的点。如下图:
再以B点为例,如果从B点出发,沿着边AB方向画一条射线,该射线围绕着点B逆时针转动,那么点C就是该条射线第一个碰到的点(角最小),点A是这条射线最后一个碰到的点(角最大)。如下图:
依次分析凸包上其它的点,都满足该特性。
我们利用这个特点来求得凸包。步骤: