什么是凸包?
- 假设一个二维平面上有一堆点,把这些点围起来的多边形就是凸包。
怎么找凸包?
- Andrew’s Monotone Chain【O(n*logn)】
- Graham Scan【O(n*logn)】
- Chan’s algorithm
- Quick hull
- 分治法
- ……
Andrew’s Monotone Chain
- 先按照横坐标排序

- 维护一个stack,存放目前认为是凸包的点

- 依次将点放入stack,并检查是否为凸包

- 如果破坏了凸包,就把最后一个点拿掉,再试试看

-
Graham Scan
先选一个凸包内或者凸包上的点
- 其他点按照斜率顺时钟排序

- 维护一个stack,存放目前认为是凸包的点

- 依次将点放入stack,并检查是否为凸包

- 如果破坏了凸包,就把最后一个点拿掉,再试试看

- 不用分上下凸包,一次即可完成~
如何判断凸包?
- 试用叉积判断三点的连线是顺时针/逆时针旋转
把三个点带入函数
struct point{int x,y;};int cross(point a, point b, point c){return (b.x - a.x) * (c.y - b.y) - (b.y - a.y) * (c.x - b.x);}
- 返回负值表示顺时针
- 返回正值表示逆时针
- 返回0表示三点共线
