学习笔记
Andrew算法
算法做两次扫描,先从最左边的点沿下凸包扫描到最右边,再从最右边的点沿上凸包扫描到最左边,上下合在一起是完整的凸包。
例题
模板题:求凸包周长
以下convex_hull
函数为核心求解凸包的函数,凸包顶点放在ch
数组中,返回值为顶点数。
//计算几何
int sgn(db x) {
//判断浮点数是否为0,为0时返回0
if (fabs(x) < eps) return 0;
return x < 0 ? -1 : 1;
}
struct point{
db x, y;
point operator + (point B) {
return point{
x + B.x, y + B.y};}
point operator - (point B) {
return point{
x - B.x, y - B.y};}
bool operator == (point B) {
return sgn(x - B.x) == 0 && sgn(y - B.y) == 0;}
bool operator < (point B) {
//用于sort排序
return sgn(x - B.x) < 0 || (sgn(x - B.x) == 0 && sgn(y - B.y) < 0);
}
}p[maxn], ch[maxn];
db cross(point A, point B) {
return A.x * B.y - A.y * B.x;}//求×积
db distance(point A, point B) {
return hypot(A.x - B.x, A.y - B.y);}
//求凸包,凸包顶点放在ch中,返回值为顶点数
int convex_hull(point *p, int n, point *ch) {
sort(p, p + n);