将所有点按照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;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注