1.求凸包
https://blog.csdn.net/sunflower_sara/article/details/81222376
2.求最小外接矩形
对于多边形 P 的一个外接矩形存在一条边与原多边形的边共线。
不仅不必去检测所有可能的方向, 而且只需要检测与多边形边数相等数量的矩形。
图示上述结论: 四条切线(红色), 其中一条与多边形一条边重合, 确定了外接矩形(蓝色)。
一个简单的算法是依次将每条边作为与矩形重合的边进行计算。 但是这种构造矩形的方法涉及到计算多边形每条边端点, 一个花费 O(n) 时间(因为有 n 条边)的计算。 整个算法将有二次时间复杂度。
一个更高效的算法已经发现。 利用旋转卡壳, 我们可以在常数时间内实时更新, 而不是重新计算端点。
实际上, 考虑一个凸多边形, 拥有两对和 x 和 y 方向上四个端点相切的切线。 四条线已经确定了一个多边形的外接矩形。 但是除非多边形有一条水平的或是垂直的边, 这个矩形的面积就不能算入最小面积中。
然而, 可以通过旋转线直到条件满足。 这个过程是下属算法的核心。 假设按照顺时针顺序输入一个凸多边形的n 个顶点。
- 计算全部四个多边形的端点, 称之为 xminP, xmaxP, yminP, ymaxP。
- 通过四个点构造 P 的四条切线。 他们确定了两个“卡壳”集合。
- 如果一条(或两条)线与一条边重合, 那么计算由四条线决定的矩形的面积, 并且保存为当前最小值。 否则将当前最小值定义为无穷大。
- 顺时针旋转线直到其中一条和多边形的一条边重合。
- 计算新矩形的面积, 并且和当前最小值比较。 如果小于当前最小值则更新, 并保存确定最小值的矩形信息。
- 重复步骤4和步骤5, 直到线旋转过的角度大于90度。
- 输出外接矩形的最小面积。
因为两对的“卡壳”确定了一个外接矩形, 这个算法考虑到了所有可能算出最小面积的矩形。 进一步, 除了初始值外, 算法的主循环只需要执行顶点总数多次。 因此算法是线性时间复杂度的。