一、凸包
关于凸包的严格定义,这里不打算写出来,大家可以自行Google或者百度,因为严格的数学定义反而不太好理解,用最通俗的话来解释凸包:给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,使得它能包含点集中所有的点,凸包最常见的应用是求平面上距离最远的两个点。
【凸包的特点】:
首先我们观察一下任何一个凸包,很明显的一个特点就是,凸包是凸多边。那么凸多边有什么用呢,我们来看看一个凸包上连续三点的一些关系。我们让这连续的三个点分别为p0,p1,p2。
向量 a = p1 - p0;
向量 b = p2 - p0;
特点:在凸包上找两个连续的点,如果下一个点是凸包上的点,则b在向量a的右端。
二、最小圆覆盖(三点定圆)
最小圆覆盖问题指平面上有n个点,给定n个点的坐标,找到一个半径最小的圆,将n个点全部包围,点可以在圆上。
假设圆O是前i-1个点得最小覆盖圆,加入第i个点,如果在圆内或边上则什么也不做。否则新得到的最小覆盖圆肯定经过第i个点。然后以第i个点为基础(半径为0),重复以上过程依次加入第j个点,若第j个点在圆外,则最小覆盖圆必经过第j个点。重复以上步骤(因为最多需要三个点来确定这个最小覆盖圆,所以重复三次)。遍历完所有点之后,所得到的圆就是覆盖所有点得最小圆。证明可以考虑这么做:最小圆必定是可以通过不断放大半径,直到所有以任意点为圆心,半径为半径的圆存在交点,此时的半径就是最小圆。所以上述定理可以通过这个思想得到。这个做法复杂度是O(n)的,当加入圆的顺序随机时,因为三点定一圆,所以不在圆内概率是3/i,求出期望可得是O(n)。
三、判断一个点是否在多边形内部(射线法思路)
首先想到的一个解法是从这个点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部,否则点在多边形外。
常识:直线穿越多边形边界时,有且只有两种情况:进入多边形或穿出多边形。 在不考虑非欧空间的情况下,直线不可能从内部再次进入多边形,或从外部再次穿出多边形,即连续两次穿越边界的情况必然成对。