凸包

向量的叉乘就是由该两个向量所组成的平行四边形的面积(x1y2-x2y1).
这个凸包不是太懂.先留模板在此
这个是水平排序

#include
using namespace std;
#define ll long long
#define db double

const int MAX = 1e3+7;
//const int maxn = 3e6+5;
const int mod = 1000000007;
const db eps = 1e-7;
int ca = 1;

struct PO
{
    int x, y;
    PO (){};
    PO (int x, int y):x(x), y(y){};
    friend PO operator - (const PO&a, const PO&b)
    {
        return PO(a.x-b.x, a.y-b.y);
    }
};
PO pos[MAX];//存点
PO ch[MAX];//栈
bool cmp(const PO&a, const PO&b)
{
    if(a.x==b.x)return a.y1 && cross(pos[i]-ch[m-2], ch[m-1]-ch[m-2])>=0) m--;
        ch[m++] = pos[i];
    }
    //第二条链
    int temp = m;
    for(int i=n-2; i>=0; i--)
    {
        while(m>temp && cross(pos[i]-ch[m-2], ch[m-1]-ch[m-2])>=0) m--;
        ch[m++] = pos[i];
    }
    if(n>1) m--;
    cout << "______________"<> t;
    while (t--) solve();

}

这个是极角排序

#include
#include
#define eps 1e-10
#define pi 3.1415926535898
#define N 1010
/*
point[]:输入的点集
ch[]:输出的凸包上的点集,按照逆时针方向排列
n:point中的点的数目
len:输出的凸包上的点的个数
*/
struct node
{
    double x,y;
} point[N],ch[N];
int n,len;
double multi(node a,node b,node c)
{
    return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);
}
double dis(node a,node b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void graham_scan(node point[N],node ch[N],int n)
{
    int i,j,k,top;
    struct node t;
    k=0; //找到最下且偏左的那个点
    for(i=1; i0||(fabs(multi(point[j],point[k],point[0]))<=eps&&
                    (dis(point[0],point[j])0||fabs(multi(point[i],ch[top],ch[top-1]))<=eps)
            top--;
        //当前点与栈内所有点满足向左关系,因此入栈
        ch[++top]=point[i];
    }
    len=top+1;
}
int main()
{
    int i;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0; i

你可能感兴趣的:(凸包)