凸包
定义
平面上 N 个点的凸包是包围这 N 个点的最小多边形
应用
- 机器人运动路径规划:找到起点 S 到终点 T 之间的最短路径,而且需要避开一个多边形路障
s 和 t 之间的最短路径就是 s 和 t 之间的直线距离,或者凸包中上下折线中的其中之一
- 最远的两点:平面上有 N 个点,希望找到这 N 个点中,距离最远的那一个点对
距离最远的那一对点,一定在凸包上
属性
- 在凸包上,可以只通过做逆时针转弯而遍历闭凸包
- 以最小的 y 值点 p 为原点,与其他点的连线的极角逐渐增大
凸包算法-Graham scan
算法思想
Graham scan 算法思想是基于凸包的两个属性:
- 求取 N 个点中,y 值最小的点 p
- 将剩余的 N - 1 个点,按照与点 p 的极角值进行排序
- 遍历排序后的 N - 1 个点,只保留那些进行逆时针旋转的点
逆时针旋转点
现在有三个点,a, b, c。如何确定 a -> b -> c 是逆时针旋转点?
只有当 c 在 a -> b 连线的左侧的时候,c 才是逆时针旋转点
当 c 是逆时针旋转点的时候,数学上有:
a b ⃗ × b c ⃗ = [ a b x b c y − a b y b c x ] \vec {ab} \times \vec{bc} = \begin{bmatrix} ab_xbc_y-ab_ybc_x \end{bmatrix} ab×b