ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

凸包与直线的关系

2021-09-14 05:31:05  阅读:142  来源: 互联网

标签:关系 直线 Point int s2 s1 Cross 凸包 double


给一个逆时针的凸包和一条线,问你线的左边的和凸包的交面积
https://onlinejudge.u-aizu.ac.jp/courses/library/4/CGL/4/CGL_4_C

int n;
Point p[N],ch[N];
Point last[N];  //最后存在的点
//两直线交点
Point Cross_point(Point a,Point b,Point c,Point d) { //Line1:ab, Line2:cd
	double s1 = Cross(b-a,c-a);
	double s2 = Cross(b-a,d-a); //叉积有正负
	return Point(c.x*s2-d.x*s1,c.y*s2-d.y*s1)/(s2-s1);
}

double area(int n,Point a[]) {  //求面积[0,n]
	double res=0;
	n++;
	for(int i=0; i<n; i++) {
		res+=(a[i]-a[0])^(a[(i+1)%n]-a[0]);
	}
	return res/2.0;
}

double convex_cut(Point p1,Point p2) { //p1->p2,右边不要
	int al=-1;
	for(int i=0; i<n; i++) {
		int t1=sgn((p2-p1)^(p[i]-p1));
		int t2=sgn((p2-p1)^(p[(i+1)%n]-p1));
		if(t1 >=0)last[++al]=p[i];    //p1在线左边(逆时针方向)
		if(t1*t2<0)last[++al]=Cross_point(p[i],p[(i+1)%n],p1,p2);  //直线穿过,取交点
	}
	double res=area(al,last);
	return res;
}

void work() {
	scanf("%d",&n);
	for(int i=0; i<n; i++) {//逆时针给出的凸包
		scanf("%lf%lf",&p[i].x,&p[i].y);
	}
	int q;scanf("%d",&q);
	while(q--) {
		Point p1,p2;
		scanf("%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y);
		double ans = convex_cut(p1,p2);
		printf("%.8f\n",ans);
	}
}

标签:关系,直线,Point,int,s2,s1,Cross,凸包,double
来源: https://www.cnblogs.com/LaiYiC/p/15265814.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有