[ECNU 1624] 求交集多边形面积
| 
 求交集多边形面积 
 | 
Time Limit:1000MS Memory Limit:30000KB Total Submit:98 Accepted:42
Description 
在平面上有两给定的凸多边形,若两凸多边形相交,则它们的交集也是一个凸多边形。若两凸多边形不相交,指的是两凸多边形相离或仅限于边界点与边上相交,则相交面积为0。如图所示: 你的任务是编程给出交集多边形的面积。 
 两给定的凸多边形按顺时针方向依次给出多边形每个顶点的坐标。
Input 
输入文件第一行为一整数M,表示第一个凸多边形的边数,以后M行分别给出了M个顶点的坐标;接着,给出第二个凸多边形的边数N,以后N行分别给出了N个顶点的坐标。
Output 
只一个数据即交集面积,保留两位小数点。
Sample Input 
4
0 0
0 1
1 1
1 0
4
-0.5 -0.5
-0.5 0.5
0.5 0.5
0.5 -0.5
Sample Output 
0.25
只适用于两个凸多边形
半平面交、不确定是不是对的、- -
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define EPS 1e-8
#define N 1010 int n;
int dq[N];
int top,bot,pn; int dump(double x)
{
if(fabs(x)<EPS) return ;
return x>?:-;
} struct Point
{
double x,y;
Point (){}
Point (double x,double y):x(x),y(y){}
Point operator - (Point p){
return Point(x-p.x,y-p.y);
}
Point operator + (Point p){
return Point(x+p.x,y+p.y);
}
Point operator * (double d){
return Point(x*d,y*d);
}
double operator ^ (Point p){
return x*p.y-y*p.x;
}
}; struct Line
{
Point s,e;
double k;
Line(){}
Line(Point s,Point e):s(s),e(e){
k=atan2(e.y-s.y,e.x-s.x);
}
Point operator & (Line l){
return s+(e-s)*(((l.e-l.s)^(l.s-s))/((l.e-l.s)^(e-s)));
}
}; Line l[N];
Point p[N]; bool HPIcmp(Line a,Line b)
{
int d=dump(a.k-b.k);
if(!d) return dump((b.s-a.s)^(b.e-a.s))>;
return d<;
} bool Judge(Line a,Line b,Line c)
{
Point p=b&c;
return dump((a.s-p)^(a.e-p))<;
} void HPI(int n)
{
int i,j;
sort(l,l+n,HPIcmp);
for(i=,j=;i<n;i++)
{
if(dump(l[i].k-l[j].k)>) l[++j]=l[i];
}
n=j+;
dq[]=;
dq[]=;
top=;
bot=;
for(i=;i<n;i++)
{
while(top>bot && Judge(l[i],l[dq[top]],l[dq[top-]])) top--;
while(top>bot && Judge(l[i],l[dq[bot]],l[dq[bot+]])) bot++;
dq[++top]=i;
}
while(top>bot && Judge(l[dq[bot]],l[dq[top]],l[dq[top-]])) top--;
while(top>bot && Judge(l[dq[top]],l[dq[bot]],l[dq[bot+]])) bot++;
dq[++top]=dq[bot];
for(pn=,i=bot;i<top;i++,pn++)
{
p[pn]=l[dq[i+]]&l[dq[i]];
}
} double GetArea()
{
double marea=;
if(pn<) return ;
for(int i=;i<pn;i++)
{
marea+=(p[i]-p[])^(p[i-]-p[]);
}
return fabs(marea)/;
} int main()
{
int n,m,tot;
while(scanf("%d%d",&n,&m)!=EOF)
{
tot=;
Point p1[N],p2[N];
for(int i=;i<n;i++) scanf("%lf%lf",&p1[i].x,&p1[i].y);
for(int i=;i<m;i++) scanf("%lf%lf",&p2[i].x,&p2[i].y);
for(int i=;i<n;i++) l[tot++]=Line(p1[i],p1[(i-+n)%n]);
for(int i=;i<m;i++) l[tot++]=Line(p2[i],p2[(i-+m)%m]);
HPI(tot);
printf("%.2f\n",GetArea());
}
return ;
}
[ECNU 1624] 求交集多边形面积的更多相关文章
- ecnu1624求交集多边形面积
		
链接 本来在刷hdu的一道题..一直没过,看到谈论区发现有凹的,我这种方法只能过凸多边形的相交面积.. 就找来这道题试下水. 两个凸多边形相交的部分要么没有 要么也是凸多边形,那就可以把这部分单独拿出 ...
 - hdu-2036求任意多边形面积
		
改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
 - 求任意多边形面积  python实现
		
数学解决方法: 多边形外选取一点,连接各点构成三角形,计算求和...... 详细链接 http://blog.csdn.net/hemmingway/article/details/7814494 ...
 - HDU 2036 求任意多边形面积向量叉乘
		
三角形的面积可以使用向量的叉积来求: 对于 三角形的面积 等于: [(x2 - x1)*(y3 - y1)- ( y2 - y1 ) * ( x3 - x1 ) ] / 2.0 但是面积是有方向的, ...
 - poj 1654 Area(计算几何--叉积求多边形面积)
		
一个简单的用叉积求任意多边形面积的题,并不难,但我却错了很多次,double的数据应该是要转化为long long,我转成了int...这里为了节省内存尽量不开数组,直接计算,我MLE了一发...,最 ...
 - EOJ 1058. 挤模具 (多边形面积)
		
题目链接:1058. 挤模具 题意 给出模具的底和体积,求模具的高. 思路 模具的底为多边形,因此求出多边形面积,用体积除以底的面积就是答案. 多边形的面积求解见 EOJ 1127. 多边形面积(计算 ...
 - 三角剖分求多边形面积的交 HDU3060
		
//三角剖分求多边形面积的交 HDU3060 #include <iostream> #include <cstdio> #include <cstring> #i ...
 - Area - POJ 1654(求多边形面积)
		
题目大意:从原点开始,1-4分别代表,向右下走,向右走,向右上走,向下走,5代表回到原点,6-9代表,向上走,向左下走,向左走,向左上走.求出最后的多边形面积. 分析:这个多边形面积很明显是不规则的, ...
 - hdu 2036 求多边形面积 (凸、凹多边形)
		
<题目链接> Problem Description “ 改革春风吹满地,不会AC没关系;实在不行回老家,还有一亩三分地.谢谢!(乐队奏乐)” 话说部分学生心态极好,每天就知道游戏,这次考 ...
 
随机推荐
- 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联
			
转载自:http://www.kancloud.cn/yueqian_scut/emlinux/106829 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sy ...
 - Aspose.word总结
			
1.创建word模版,使用MergeFeild绑定数据 新建一个Word文档,命名为Template.doc 注意:这里并不是输入"<”和“>”就可以了,而是必须 ...
 - 压力测试之apache benchmark
			
ab 的全称是 ApacheBench , 是 Apache 附带的一个小工具 , 专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求.前段时间看到 ...
 - Python之路----文件操作
			
文件操作 1.能调用方法的一定是对象,比如数值.字符串.列表.元组.字典,甚至文件也是对象,Python中一切皆为对象. str1 = 'hello' str2 = 'world' str3 = ' ...
 - FolderBrowserDialog组件选择文件夹
			
1.选择路径 this.folderBrowserDialog1.ShowDialog(); if (this.folderBrowserDialog1.ShowDialog() == DialogR ...
 - 蜗牛历险记(二) Web框架(下)
			
Web框架第三篇--缓存篇 缓存的优劣很大程度上决定了框架的效率,一个有节操的缓存它应该是高效的,利用率高的,具备更多扩展功能的. 一.介绍之前 计算机各个硬件的运行效率是不一样的,CPU>&g ...
 - sencha touch mvc
			
controller: Ext.define('MyApp2.controller.MyController1', { extend: 'Ext.app.Controller', config: { ...
 - 全国省市级联数据sql语句 mysql版
			
全国省市级联数据sql语句 mysql版 --省级 provincial create table provincial ( provincialID int, provincialName ), p ...
 - 鼠标到哪tl到哪
			
$(".navcon a").mouseover(function(){ var that = $(this), index = that.index(); that.addCla ...
 - BZOJ 3901 棋盘游戏 解题报告
			
这题有个重要性质: 我们设 Flag[i][j] 表示 (i, j) 是否被奇数个操作所覆盖, 也就是操作次数对 2 取模. 设 x = (n + 1) / 2. 那么对于所有的合法的操作方案, 令 ...