(1)问题:
给定二维平面点集,求最小的包含所有点的凸多边形。
(2)Gramham-Scan算法:
Gramham-Scan是一种灵活的凸包算法,其总的时间复杂度仅为O(n*log(n))。
步骤:
Step1: 选定x坐标最小(相同情况y最小)的点作为极点,这个点必在凸包上;
Step2: 将其余点按极角排序,在极角相同的情况下比较与极点的距离,离极点比较近的优先;
Step3: 用一个栈S存储凸包上的点,先将按极角和极点排序最小的两个点入栈;
Step4: 按序扫描每个点,检查栈顶的两个元素与这个点构成的折线段是否“拐”向右侧(叉积小于等于零);
Step5: 如果满足,则弹出栈顶元素,并返回Step4再次检查,直至不满足。将该点入栈,并对其余点不断执行此操作;
Step6: 最终栈中元素为凸包的顶点序列。
(3)模板(来自kuangbin模板)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const double eps = 1e-8;
struct Point{
double x, y;
};
const int MAXN = 1010;
Point list[MAXN];
int stack[MAXN], top;
/***
* 叉积