二维凸包模板

double cross(Point a,Point b)
{
    return a.x*b.y-a.y*b.x;
}
double mul(Point p0,Point p1,Point p2)
{
    return cross(p1-p0,p2-p0);
}
double dis(Point a)
{
    return sqrt(a.x*a.x+a.y*a.y);
}
bool cmp(Point a,Point b)
{
    if(dcmp(mul(p[0],a,b))==0)
        return dis(a-p[0])<dis(b-p[0]);
    else
        return dcmp(mul(p[0],a,b))>0;
}
int Graham(int n)
{
    int i,k = 0,top;
    Point tmp;
    for(i = 0 ; i < n; i++)
    {
        if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x))
            k = i;
    }
    if(k!=0)
    {
        tmp = p[0];
        p[0] = p[k];
        p[k] = tmp;
    }
    sort(p+1,p+n,cmp);
    ch[0] = p[0];
    ch[1] = p[1];
    top = 1;
    for(i = 2; i < n ; i++)
    {
        while(top>0&&dcmp(mul(ch[top-1],ch[top],p[i]))<0)
            top--;
        top++;
        ch[top] = p[i];
    }
    return top;
}

 

posted @ 2014-07-02 21:30  _雨  阅读(184)  评论(0编辑  收藏  举报