计算几何_凸包

 

struct point{
	double x, y;
};
//多边形类
struct poly{
	static const int N = 105; //点数的最大值
	point ps[N+5]; //逆时针存储多边形的点,[0,pn-1]存储点
	int pn;  //点数
	poly() { pn = 0; }
	//加进一个点
	void push(point tp){
		ps[pn++] = tp;
	}
	//第k个位置
	int trim(int k){
		return (k+pn)%pn;
	}
	void clear(){ pn = 0; }
};
bool cmp(point d1, point d2){
	return d1.y < d2.y || (d1.y == d2.y && d1.x < d2.x);
}
//st1-->ed1叉乘st2-->ed2的值
double xmul(point st1, point ed1, point st2, point ed2){
	return (ed1.x - st1.x) * (ed2.y - st2.y) - (ed1.y - st1.y) * (ed2.x - st2.x);
}
//返回含有n个点的点集ps的凸包
poly graham(point* ps, int n){
	sort(ps, ps + n, cmp);
	poly ans;
	if(n <= 2){
		for(int i = 0; i < n; i++){
			ans.push(ps[i]);
		}
		return ans;
	}
	ans.push(ps[0]);
	ans.push(ps[1]);
	point* tps = ans.ps;
	int top = -1;
	tps[++top] = ps[0];
	tps[++top] = ps[1];
	for(int i = 2; i < n; i++){
		while(top > 0 && xmul(tps[top - 1], tps[top], tps[top - 1], ps[i]) <= 0) top--;
		tps[++top] = ps[i];
	}
	int tmp = top;  //注意要赋值给tmp!
	for(int i = n - 2; i >= 0; i--){
		while(top > tmp && xmul(tps[top - 1], tps[top], tps[top - 1], ps[i]) <= 0) top--;
		tps[++top] = ps[i];
	}
	ans.pn = top;
	return ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值