[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没关系;实在不行回老家,还有一亩三分地.谢谢!(乐队奏乐)” 话说部分学生心态极好,每天就知道游戏,这次考 ...
随机推荐
- Codevs 1684 垃圾陷阱
1684 垃圾陷阱 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 卡门--农夫约翰极其珍视的一条Holsteins奶牛--已经落了 ...
- C# 清除当前窗体中TextBox控件中的内容
//当有多个窗体时,对顶层的窗口进行操作,例如:我们开发具有录入功能的界面的时候,为了防止提交后的二次(重复)录入,希望点击提交按钮并提示成功后,界面的所有文本框内容能够自动清空.NET Framew ...
- [翻译][MVC 5 + EF 6] 10:处理并发
原文:Handling Concurrency with the Entity Framework 6 in an ASP.NET MVC 5 Application 1.并发冲突: 当一个用户编辑一 ...
- MailOtto 实现完美预加载以及源码解读
背景: 最近项目组需要一个小课题分享,小白刚好从微博里看到一个这样有趣的开源工具MailOtto,是阿里巴巴员工 Drakeet 维护的一个专注懒事件的事件总线,gitHub地址为:https://g ...
- c#通过反射获取类上的自定义特性
c#通过反射获取类上的自定义特性 本文转载:http://www.cnblogs.com/jeffwongishandsome/archive/2009/11/18/1602825.html 下面这个 ...
- EF 的 霸气配置
通过EF 作为操作数据库的工具有一段时间了,也做了几个相对不大的项目,慢慢的也对EF的使用摸索出来了一些规则,虽然说不是技术难点,但是,我说的是但是,能够提高我们开发效率的棉花糖有时我们还是必须要吃的 ...
- c语言知识(找出大于2门成绩不及格的学生)
1.首先定义一个学生结构体(结构体中包含一个Score结构体): typedef struct score{ float chinese;//语文成绩 float english;//英语成绩 flo ...
- windows下常用快捷键
windows下常用快捷键: 显示桌面: win徽标+D 打开资源管理器: win徽标+E 打开任务管理器: Ctrl+Alt+delete 任务切换: Alt+Tab 应用程序中窗口之间的切换: C ...
- 深度(Depth)概念
强化对深度的理解 在老版本的NGUI中,UI的显示层次关系是依靠z轴进行的.在新版本的NGUI中,所有UI的z轴都被统一,然后用深度来决定和管理显示的层次关系.关于深度,要记住一下关键点: 1.每一个 ...
- C# zip/unzip with DotNet framework 4.5
add reference System.IO.Compression.FileSystem public class ZipHelper { public static string UnZip(s ...