HDU1632+半平面交
模板题
题意:给定两个凸多边形,求出合并后的面积,这个合并后的面积不包括重叠部分。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int maxn = ;
const int maxm = ;
const double eps = 1e-;
const double pi = acos(-1.0);
struct Point{
double x,y;
};
struct Line{
Point a,b;
};
Point pnt1[ maxn ],res[ maxm ],pnt2[ maxn ],tp[ maxm ];
double xmult( Point op,Point sp,Point ep ){
return (sp.x-op.x)*(ep.y-op.y)-(sp.y-op.y)*(ep.x-op.x);
}
double dist( Point a,Point b ){
return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) );
}
void Get_equation( Point p1,Point p2,double &a,double &b,double &c ){
a = p2.y-p1.y;
b = p1.x-p2.x;
c = p2.x*p1.y-p1.x*p2.y;
}//直线方程
Point Intersection( Point p1,Point p2,double a,double b,double c ){
double u = fabs( a*p1.x+b*p1.y+c );
double v = fabs( a*p2.x+b*p2.y+c );
Point tt;
tt.x = (p1.x*v+p2.x*u)/(u+v);
tt.y = (p1.y*v+p2.y*u)/(u+v);
return tt;
}//交点、按照三角比例求出交点
double GetArea( Point p[],int n ){
double sum = ;
for( int i=;i<n;i++ ){
sum += xmult( p[],p[i],p[i+] );
}
return -sum/2.0;
}//面积,顺时针为正
void cut( double a,double b,double c,int &cnt ){
int temp = ;
for( int i=;i<=cnt;i++ ){
if( a*res[i].x+b*res[i].y+c>-eps ){//>=0
tp[ ++temp ] = res[i];
}
else{
if( a*res[i-].x+b*res[i-].y+c>eps ){
tp[ ++temp ] = Intersection( res[i-],res[i],a,b,c );
}
if( a*res[i+].x+b*res[i+].y+c>eps ){
tp[ ++temp ] = Intersection( res[i],res[i+],a,b,c );
}
}
}
for( int i=;i<=temp;i++ )
res[i] = tp[i];
res[ ] = res[ temp ];
res[ temp+ ] = res[ ];
cnt = temp;
} int main(){
int m,n;
while( scanf("%d",&n)==,n ){
for( int i=;i<=n;i++ ){
scanf("%lf%lf",&pnt1[i].x,&pnt1[i].y);
}
scanf("%d",&m);
for( int i=;i<=m;i++ ){
scanf("%lf%lf",&pnt2[i].x,&pnt2[i].y);
}
double sumArea1,sumArea2,Area;
sumArea1 = GetArea( pnt1,n );
sumArea2 = GetArea( pnt2,m );
if( sumArea1<eps ){
reverse( pnt1+,pnt1++n );
}
pnt1[ ] = pnt1[ n ];
pnt1[ n+ ] = pnt1[ ];
if( sumArea2<eps ){
reverse( pnt2+,pnt2++m );
}
pnt2[ ] = pnt2[ m ];
pnt2[ m+ ] = pnt2[ ];
for( int i=;i<=n+;i++ ){
res[i] = pnt1[i];
}
int cnt = n;
for( int i=;i<=m;i++ ){
double a,b,c;
Get_equation( pnt2[i],pnt2[i+],a,b,c );
cut(a,b,c,cnt);
}
Area = GetArea( res,cnt );
double ans = fabs(sumArea1)+fabs(sumArea2)-2.0*fabs(Area);
printf("%8.2lf",ans);
}
puts("");
return ;
}
HDU1632+半平面交的更多相关文章
- 【BZOJ-4515】游戏 李超线段树 + 树链剖分 + 半平面交
4515: [Sdoi2016]游戏 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 304 Solved: 129[Submit][Status][ ...
- poj3335 半平面交
题意:给出一多边形.判断多边形是否存在一点,使得多边形边界上的所有点都能看见该点. sol:在纸上随手画画就可以找出规律:按逆时针顺序连接所有点.然后找出这些line的半平面交. 题中给出的点已经按顺 ...
- POJ3525 半平面交
题意:求某凸多边形内部离边界最远的点到边界的距离 首先介绍半平面.半平面交的概念: 半平面:对于一条有向直线,它的方向的左手侧就是它所划定的半平面范围.如图所示: 半平面交:多个半平面的交集.有点类似 ...
- POJ 3130 How I Mathematician Wonder What You Are! /POJ 3335 Rotating Scoreboard 初涉半平面交
题意:逆时针给出N个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...
- bzoj2618[Cqoi2006]凸多边形 半平面交
这是一道半平面交的裸题,第一次写半平面交,就说一说我对半平面交的理解吧. 所谓半平面交,就是求一大堆二元一次不等式的交集,而每个二元一次不等式的解集都可以看成是在一条直线的上方或下方,联系直线的标准方 ...
- POJ 3384 Feng Shui 半平面交
题目大意:一个人很信"Feng Shui",他要在房间里放两个圆形的地毯. 这两个地毯之间可以重叠,可是不能折叠,也不能伸到房间的外面.求这两个地毯可以覆盖的最大范围.并输出这两个 ...
- BZOJ2618[Cqoi2006]凸多边形——半平面交
题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入 第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形.第 ...
- 洛谷P3222 [HNOI2012]射箭(计算几何,半平面交,双端队列)
洛谷题目传送门 设抛物线方程为\(y=ax^2+bx(a<0,b>0)\),我们想要求出一组\(a,b\)使得它尽可能满足更多的要求.这个显然可以二分答案. 如何check当前的\(mid ...
- bzoj 4445 小凸想跑步 - 半平面交
题目传送门 vjudge的快速通道 bzoj的快速通道 题目大意 问在一个凸多边形内找一个点,连接这个点和所有顶点,使得与0号顶点,1号顶点构成的三角形是最小的概率. 假设点的位置是$(x, y)$, ...
随机推荐
- bootstrap兼容IE
这种响应式的布局正是通过CSS3的媒体查询(Media Query)功能实现的,根据不同的分辨率来匹配不同的样式.IE8浏览器并不支持这一优秀的Css3特性,Bootstrap在开发文档中写了如何使用 ...
- 一点关于this的理解
关于this,是很多前端面试必考的题目,有时候在网上看到这些题目,自己试了一下,额,还真的错了!在实际开发中,也会遇到 this 的问题(虽然一些类库会帮我们处理),例如在使用一些框架的时候,例如:k ...
- 【转】Oracle - 数据库的实例、表空间、用户、表之间关系
[转]Oracle - 数据库的实例.表空间.用户.表之间关系 完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机 ...
- Python阅读清单
Python <零基础学Python(第二版)> 包括进阶 The Python Tutorial 绝对权威和主题丰富的官方教程 PEP 8 以及 PEP 257 编码风格/规范 PEP ...
- Jquery Ajax Get示例
$.ajax({ type: "GET", url:"ajax_url.php", cache: false, data:{'action':'ABC',' ...
- c#重要特性之一委托
委托的构成必须满足的4个条件: 声明委托类型: 必须有一个方法包含了要执行的代码: 必须创建一个委托实例: 必须调用(invoke)委托实例 委托包装的方法需要满足以下条件 方法的签名必须与委托一致, ...
- KMP入门(匹配)
Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M ...
- bzoj1015:[JSOI2008]星球大战starwar
思路:反着做用并查集维护连通块个数就好了. #include<iostream> #include<cstdio> #include<cstring> #inclu ...
- 生产者消费者问题c语言实现
#include <stdio.h> #include <process.h> #include <Windows.h> //信号量与关键段 CRITICAL_SE ...
- bootstrap和jQuery.Gantt的css冲突问题
bootstrap是广泛使用的一个前端框架, 而jQuery.Gantt在目前也是一个很好用的用于绘制甘特图的插件. 这次在同时使用它们时,发现甘特图显示异常,如图 不加载bootstrap. ...