美文网首页
凸包(andrew)

凸包(andrew)

作者: laochonger | 来源:发表于2018-08-05 22:27 被阅读0次

    将所有点按照x为first,y为second从小到大排序,(可以先删除相同点)得到p数组,将p1p2放到凸包中,从p3开始为左则加入,为右则删到为左,最后到最右边的点,求得下凸包,再反向一个上凸包。
    //输入点数组p,个数为n,输出点数组res,函数返回凸包顶点数
    //输入时先去除重复点(有需要时不去)
    //若是不希望边上有两个以上的点(输入点),则将<=改为<
    //精度要求高时用dcmp比较

    int andrew()
    {
        sort(p,p+n);
        int m=0;
        for (int i=0;i<n;i++)
        {
            while (m>1&&cross(res[m-1]-res[m-2],p[i]-res[m-2])<0) --m;
            res[m++]=p[i];
        }
        int k=m;
        for (int i=n-2;i>=0;--i)
        {
            while (m>k&&cross(res[m-1]-res[m-2],p[i]-res[m-2])<0) --m;
            res[m++]=p[i];
        }
        if (m>1) --m;
        return m;
    }
    

    相关文章

      网友评论

          本文标题:凸包(andrew)

          本文链接:https://www.haomeiwen.com/subject/ffyivftx.html