凸包
转自 https://www.cnblogs.com/wuwangchuxin0924/p/6223152.html 了解凸包及Graham扫描法 问题描述:二位平面内,给定n个散乱的点,求一个最小凸多边形(凸包),使得n个点都不在凸多边形外。 问题的解决用到Graham算法: 算法步骤: 1.取y坐标最小的一点,作为p0,显然p0一定在凸包上。 2.将p0作为坐标系原点,其他点按极角从小到大排序,从p1开始编号。 3.从小到大遍历所有点:显然[p0, p1] 在凸包中 4.连接p1, p2的时候需要判断:p0->p1 叉乘 p1->p2 是否大于0: > 0 p1->p2 在 p0->p1 夹角小于π,物理意义:p1->p2 在 p0->p1的左边,满足凸多边形定义。 = 0 p1->p2 与 p0->p1 共线,同向满足,相反不满足。 < 0 p1->p2 在 p0->p1 夹角大于π,不满足。 5.连接p2, p3 向量p2->p3在p1->p2左边,满足定义,当连接p3, p4的时候,发现不满足定义了,此时要放弃p3, 从p2开始回溯,找到第一个满足要求的点。 6.以此类推,知道回到p0点。 Graham scan 正确性: 令散点的数量为k,散点(p0 ~ pk – 1)已经按照极角排序。 当k=3时,显然,p0-