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)$, ...
随机推荐
- PHP之数组函数归类
数组之所以强大,除了本身声明.存储方式灵活,它还有坚强后盾:一系列功能各异的数组处理函数.就像一只军队,除了领队将军本身能征善战,指挥英明之外,还有一群不怕死.忠实于他的士兵,这样才能显得整体的强大. ...
- Base64 编码
Base64 字母表 Base64 编码将一个 8 位字节序列拆成 6 位的片段,并为每个 6 位的片段分配一个字符,这个字符是 Base64 字母表中的 64 个字符之一. Wert Zeichen ...
- 导出Excel事例
DataTable table = new DataTable(); StringWriter sw = new StringWriter(); string tabltitle = "客户 ...
- 转--T-SQL 总结
把长日期转换为短日期 Convert(char(10),getdate(),120) MS-SQL数据库开发常用汇总 1.按姓氏笔画排序:Select * From TableName Orde ...
- PHP与Java使用des加密通讯
http://www.pocketdigi.com/20121112/940.html 原文:http://toptulip.iteye.com/blog/780309 使用php加密字符串,生成密文 ...
- 20140717 随笔 技术文章安家至CSDN
今天意外的看到了阳光小强的博客,接着在CSDN里看着各种博客,又有一种冲动,想在CSDN里安家.我是一个不安分的人,或者说是不能坚持的人,喜新厌旧属于我吧.看到新鲜的就要去试一下,但是能够坚持下来的却 ...
- (四)JAVA使用POI操作excel
1,字体处理 Demo12.java package com.wishwzp.poi; import java.io.FileOutputStream; import org.apache.poi.h ...
- iOS-学习路线图(推荐)
在学习一个新的知识时,除了保持积极的态度.对知识的渴望,学习路线以及方法也是很重要的.在学习iOS的时候,遇到这样的情况,非常想去学习,提高,但是没有一个学习路线,不知道从哪里入手,该先学什么.在学什 ...
- C语言变参函数/Variadic fucntion
几个重要的 宏/类型 定义 Macros Defined in header <stdarg.h> va_start enables access to variadic function ...
- IP address/地址 检查
1.Determine if a string is a valid IP address in C Beej's Guide to Network Programming 2.9.14. inet_ ...