模板题

题意:给定两个凸多边形,求出合并后的面积,这个合并后的面积不包括重叠部分。

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<math.h>
  5. #include<algorithm>
  6. using namespace std;
  7. const int maxn = ;
  8. const int maxm = ;
  9. const double eps = 1e-;
  10. const double pi = acos(-1.0);
  11. struct Point{
  12. double x,y;
  13. };
  14. struct Line{
  15. Point a,b;
  16. };
  17. Point pnt1[ maxn ],res[ maxm ],pnt2[ maxn ],tp[ maxm ];
  18. double xmult( Point op,Point sp,Point ep ){
  19. return (sp.x-op.x)*(ep.y-op.y)-(sp.y-op.y)*(ep.x-op.x);
  20. }
  21. double dist( Point a,Point b ){
  22. return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) );
  23. }
  24. void Get_equation( Point p1,Point p2,double &a,double &b,double &c ){
  25. a = p2.y-p1.y;
  26. b = p1.x-p2.x;
  27. c = p2.x*p1.y-p1.x*p2.y;
  28. }//直线方程
  29. Point Intersection( Point p1,Point p2,double a,double b,double c ){
  30. double u = fabs( a*p1.x+b*p1.y+c );
  31. double v = fabs( a*p2.x+b*p2.y+c );
  32. Point tt;
  33. tt.x = (p1.x*v+p2.x*u)/(u+v);
  34. tt.y = (p1.y*v+p2.y*u)/(u+v);
  35. return tt;
  36. }//交点、按照三角比例求出交点
  37. double GetArea( Point p[],int n ){
  38. double sum = ;
  39. for( int i=;i<n;i++ ){
  40. sum += xmult( p[],p[i],p[i+] );
  41. }
  42. return -sum/2.0;
  43. }//面积,顺时针为正
  44. void cut( double a,double b,double c,int &cnt ){
  45. int temp = ;
  46. for( int i=;i<=cnt;i++ ){
  47. if( a*res[i].x+b*res[i].y+c>-eps ){//>=0
  48. tp[ ++temp ] = res[i];
  49. }
  50. else{
  51. if( a*res[i-].x+b*res[i-].y+c>eps ){
  52. tp[ ++temp ] = Intersection( res[i-],res[i],a,b,c );
  53. }
  54. if( a*res[i+].x+b*res[i+].y+c>eps ){
  55. tp[ ++temp ] = Intersection( res[i],res[i+],a,b,c );
  56. }
  57. }
  58. }
  59. for( int i=;i<=temp;i++ )
  60. res[i] = tp[i];
  61. res[ ] = res[ temp ];
  62. res[ temp+ ] = res[ ];
  63. cnt = temp;
  64. }
  65.  
  66. int main(){
  67. int m,n;
  68. while( scanf("%d",&n)==,n ){
  69. for( int i=;i<=n;i++ ){
  70. scanf("%lf%lf",&pnt1[i].x,&pnt1[i].y);
  71. }
  72. scanf("%d",&m);
  73. for( int i=;i<=m;i++ ){
  74. scanf("%lf%lf",&pnt2[i].x,&pnt2[i].y);
  75. }
  76. double sumArea1,sumArea2,Area;
  77. sumArea1 = GetArea( pnt1,n );
  78. sumArea2 = GetArea( pnt2,m );
  79. if( sumArea1<eps ){
  80. reverse( pnt1+,pnt1++n );
  81. }
  82. pnt1[ ] = pnt1[ n ];
  83. pnt1[ n+ ] = pnt1[ ];
  84. if( sumArea2<eps ){
  85. reverse( pnt2+,pnt2++m );
  86. }
  87. pnt2[ ] = pnt2[ m ];
  88. pnt2[ m+ ] = pnt2[ ];
  89. for( int i=;i<=n+;i++ ){
  90. res[i] = pnt1[i];
  91. }
  92. int cnt = n;
  93. for( int i=;i<=m;i++ ){
  94. double a,b,c;
  95. Get_equation( pnt2[i],pnt2[i+],a,b,c );
  96. cut(a,b,c,cnt);
  97. }
  98. Area = GetArea( res,cnt );
  99. double ans = fabs(sumArea1)+fabs(sumArea2)-2.0*fabs(Area);
  100. printf("%8.2lf",ans);
  101. }
  102. puts("");
  103. return ;
  104. }

HDU1632+半平面交的更多相关文章

  1. 【BZOJ-4515】游戏 李超线段树 + 树链剖分 + 半平面交

    4515: [Sdoi2016]游戏 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 304  Solved: 129[Submit][Status][ ...

  2. poj3335 半平面交

    题意:给出一多边形.判断多边形是否存在一点,使得多边形边界上的所有点都能看见该点. sol:在纸上随手画画就可以找出规律:按逆时针顺序连接所有点.然后找出这些line的半平面交. 题中给出的点已经按顺 ...

  3. POJ3525 半平面交

    题意:求某凸多边形内部离边界最远的点到边界的距离 首先介绍半平面.半平面交的概念: 半平面:对于一条有向直线,它的方向的左手侧就是它所划定的半平面范围.如图所示: 半平面交:多个半平面的交集.有点类似 ...

  4. POJ 3130 How I Mathematician Wonder What You Are! /POJ 3335 Rotating Scoreboard 初涉半平面交

    题意:逆时针给出N个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...

  5. bzoj2618[Cqoi2006]凸多边形 半平面交

    这是一道半平面交的裸题,第一次写半平面交,就说一说我对半平面交的理解吧. 所谓半平面交,就是求一大堆二元一次不等式的交集,而每个二元一次不等式的解集都可以看成是在一条直线的上方或下方,联系直线的标准方 ...

  6. POJ 3384 Feng Shui 半平面交

    题目大意:一个人很信"Feng Shui",他要在房间里放两个圆形的地毯. 这两个地毯之间可以重叠,可是不能折叠,也不能伸到房间的外面.求这两个地毯可以覆盖的最大范围.并输出这两个 ...

  7. BZOJ2618[Cqoi2006]凸多边形——半平面交

    题目描述 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. 输入 第一行有一个整数n,表示凸多边形的个数,以下依次描述各个多边形.第 ...

  8. 洛谷P3222 [HNOI2012]射箭(计算几何,半平面交,双端队列)

    洛谷题目传送门 设抛物线方程为\(y=ax^2+bx(a<0,b>0)\),我们想要求出一组\(a,b\)使得它尽可能满足更多的要求.这个显然可以二分答案. 如何check当前的\(mid ...

  9. bzoj 4445 小凸想跑步 - 半平面交

    题目传送门 vjudge的快速通道 bzoj的快速通道 题目大意 问在一个凸多边形内找一个点,连接这个点和所有顶点,使得与0号顶点,1号顶点构成的三角形是最小的概率. 假设点的位置是$(x, y)$, ...

随机推荐

  1. 对象创建型模式------Builder(生成器或建造者模式)(2)

    链接转自:http://blog.csdn.net/wuzhekai1985/article/details/6667467 主要思想是:首先有个指挥家思想者将大体的设计思路设计出来,然后寻找一部分工 ...

  2. 使用for xml path 分组查询

     SELECT  OLevel, WorkOrgID, WorkOrgName, PlanNum, PlanFinishNum, PlanUnFinishNum, PlanCanceledNum, P ...

  3. ios llvm and clang build tools

    1. 使用 libclan g或 clang 插件 包括( libclang 和  Clangkit) 备注: Clangkit,它是基于 clang 提供的功能,用 Objective-C 进行封装 ...

  4. UICollectionView的简单使用

    ChildModel.h #import <Foundation/Foundation.h> @interface ChildModel : NSObject @property (non ...

  5. IIS7 发现无法显示ewebeditor编辑器成空白

    vs2003写的网站,很早了,编辑器用的是ewebeditor,每次更换程序编辑器都会出问题.今天记录一下. 内部老网站在Windows2003 iis6上运行的. 现在要迁移到2008上64位.08 ...

  6. android 登陆案例_sd卡

    代码: <?xml version="1.0"?> -<LinearLayout android:paddingTop="@dimen/activity ...

  7. Cabarc Overview (Microsoft TechNet)

    Original Link:  Cabarc Overview Applies To: Windows Server 2003, Windows Server 2003 R2, Windows Ser ...

  8. STL简介

    由于不同书籍和翻译问题对STL中的术语可能有差别本文采用侯杰<STL源码剖析>中的术语 STL的组件 包含6个组件,分别为容器.算法.迭代器.仿函数(函数对象).配接器(适配器).配置器( ...

  9. Linux网络服务器epoll模型的socket通讯的实现(一)

    准备写一个网络游戏的服务器的通讯模块,参考网上看到的一些代码,在linux下面实现一个多线程的epoll模型的socket通讯的代码,以下是第一部分多线程的切换代码: 1 #include <s ...

  10. ASP.NET MVC3实现无刷新验证码

    在MVC中进行留言,评论等功能时,不可避免会用到表单提交时的验证码问题,有时,我们的作法是,当表单被提交后,在controller里去判断验证码的正确与否,但我认为这种用户体验是很差的,今天正好有后时 ...