凸包模板

来源:互联网 发布:php 编写服务器端 编辑:程序博客网 时间:2024/06/05 03:06
struct Node{    int x,y;    Node(int _x = 0,int _y = 0):x(_x),y(_y){}    bool operator < (const Node& b)const{        return x == b.x ? y < b.y : x < b.x;    }    Node operator - (Node b){        return     Node(x - b.x,y - b.y);    }    Node operator + (Node b){        return Node(x + b.x,y + b.y);    }}node[maxn],sta[maxn];int N;int n;void add(int x,int y){    node[n].x = x,node[n].y = y;n++;}//Cross为两向量的叉乘double  Cross(const Node & a,const Node & b){    return  a.x * b.y - a.y * b.x;}//计算凸包,其中node数组是原图形点的数组,n为点数,sta为输出数组,其中m为输出数组元素个数//输入不能有重复点,凸包函数执行完后输入点数序破坏//所求凸包的边上无点,则Cross函数后为<=  ,若要有点则为 <//精度较高时用dcmp比较//其中排序按照优先x从小到大,其次y从小到大排int get_tubao(){    sort(node,node + n);    int m = 0;    for(int i = 0;i < n;i++){        while(m > 1 && Cross(sta[m - 1] - sta[m - 2],node[i] - sta[m - 2]) <= 0)m--;        sta[m++] = node[i];    }    int k = m;    for(int i = n - 2;i >= 0;i--){        while(m > k && Cross(sta[m - 1] - sta[m - 2],node[i] - sta[m - 2]) <= 0)m--;        sta[m++] = node[i];    }    if(n > 1)m--;    return m;}

0 0
原创粉丝点击