Polygons Intersection

题意:给2个凸多边形,求相交面积

思路:不会,套板子就是了

AC代码:

#include "iostream"
#include "string.h"
#include "stack"
#include "queue"
#include "string"
#include "vector"
#include "set"
#include "map"
#include "algorithm"
#include "stdio.h"
#include "math.h"
#define ll long long
#define bug(x) cout<<x<<" "<<"UUUUU"<<endl;
#define mem(a) memset(a,0,sizeof(a))
#define mp(x,y) make_pair(x,y)
using namespace std;
const long long INF = 1e18+1LL;
const int inf = 1e9+1e8;
const int N=1e5+100;///2015 HIAST Collegiate Programming Contest///JJJJ#define maxn 510
const double eps=1E-8;
int sig(double d){return(d>eps)-(d<-eps);
}
struct Point{double x,y; Point(){}Point(double x,double y):x(x),y(y){}bool operator==(const Point&p)const{return sig(x-p.x)==0&&sig(y-p.y)==0;}
};
double cross(Point o,Point a,Point b){return(a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);
}
double area(Point* ps,int n){ps[n]=ps[0];double res=0;for(int i=0;i<n;i++){res+=ps[i].x*ps[i+1].y-ps[i].y*ps[i+1].x;}return res/2.0;
}
int lineCross(Point a,Point b,Point c,Point d,Point&p){double s1,s2;s1=cross(a,b,c);s2=cross(a,b,d);if(sig(s1)==0&&sig(s2)==0) return 2;if(sig(s2-s1)==0) return 0;p.x=(c.x*s2-d.x*s1)/(s2-s1);p.y=(c.y*s2-d.y*s1)/(s2-s1);return 1;
}
//多边形切割
//用直线ab切割多边形p,切割后的在向量(a,b)的左侧,并原地保存切割结果
//如果退化为一个点,也会返回去,此时n为1
void polygon_cut(Point*p,int&n,Point a,Point b){static Point pp[maxn];int m=0;p[n]=p[0];for(int i=0;i<n;i++){if(sig(cross(a,b,p[i]))>0) pp[m++]=p[i];if(sig(cross(a,b,p[i]))!=sig(cross(a,b,p[i+1])))lineCross(a,b,p[i],p[i+1],pp[m++]);}n=0;for(int i=0;i<m;i++)if(!i||!(pp[i]==pp[i-1]))p[n++]=pp[i];while(n>1&&p[n-1]==p[0])n--;
}
//---------------华丽的分隔线-----------------//
//返回三角形oab和三角形ocd的有向交面积,o是原点//
double intersectArea(Point a,Point b,Point c,Point d){Point o(0,0);int s1=sig(cross(o,a,b));int s2=sig(cross(o,c,d));if(s1==0||s2==0)return 0.0;//退化,面积为0if(s1==-1) swap(a,b);if(s2==-1) swap(c,d);Point p[10]={o,a,b};int n=3;polygon_cut(p,n,o,c);polygon_cut(p,n,c,d);polygon_cut(p,n,d,o);double res=fabs(area(p,n));if(s1*s2==-1) res=-res;return res;
}
//求两多边形的交面积
double intersectArea(Point*ps1,int n1,Point*ps2,int n2){if(area(ps1,n1)<0) reverse(ps1,ps1+n1);if(area(ps2,n2)<0) reverse(ps2,ps2+n2);ps1[n1]=ps1[0];ps2[n2]=ps2[0];double res=0;for(int i=0;i<n1;i++){for(int j=0;j<n2;j++){res+=intersectArea(ps1[i],ps1[i+1],ps2[j],ps2[j+1]);}}return res;//assumeresispositive!
}
//hdu-3060求两个任意简单多边形的并面积
Point ps1[maxn],ps2[maxn];
int n1,n2;
int main(){int t;cin>>t;while(t--){scanf("%d%d",&n1,&n2);for(int i=0;i<n1;i++)scanf("%lf%lf",&ps1[i].x,&ps1[i].y);for(int i=0;i<n2;i++)scanf("%lf%lf",&ps2[i].x,&ps2[i].y);double ans=intersectArea(ps1,n1,ps2,n2);//ans=fabs(area(ps1,n1))+fabs(area(ps2,n2))-ans;//容斥printf("%.4f\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/max88888888/p/7162620.html

2015 HIAST Collegiate Programming Contest J相关推荐

  1. 2015 German Collegiate Programming Contest (GCPC 15)

    2015 German Collegiate Programming Contest (GCPC 15) B. Bounty Hunter II 给定一张DAG,求一种方案:用最少的路径将所有点覆盖. ...

  2. 2015 AlBaath Collegiate Programming Contest(2月14日训练赛)

    A (By ggg): 题意:一个人还有x秒到红绿灯,这个红绿灯有g秒绿灯,y秒黄 灯,r秒红灯,问你到红绿灯的时候是什么灯.值得注意的是绿 灯变黄灯时,第g秒是黄灯了. B (By Anxdada) ...

  3. 2022 Jiangsu Collegiate Programming Contest - J. Balanced Tree

    L. Collecting Diamonds 题目描述 A binary tree T is called super balanced if T is empty or satisfies the ...

  4. 2015 ACM Arabella Collegiate Programming Contest(F题)

    F. Palindrome [ Color: Pink ] A string is palindrome if it can be read the same way in either direct ...

  5. (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)

    layout: post title: (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017) au ...

  6. 2018 German Collegiate Programming Contest (GCPC 18)

    2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...

  7. 2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)

    D.Distinctive Character 看到样例,第一个反应贪心.先写了个按这一位1和0的数目多少,确定0还是1的东西.感觉不够真,又写了个尽量加到相似的比较小的串上的贪心.在和前边的那个组合 ...

  8. 2016 China Collegiate Programming Contest Final

    2016 China Collegiate Programming Contest Final Table of Contents 2016 China Collegiate Programming ...

  9. 【The 13th Chinese Northeast Collegiate Programming Contest】I. Temperature Survey

    题目描述 [题目链接](https://codeforces.com/gym/102220/problem/I) 给定长度为 $n$ 的 $a$ 序列,保证 $a_n \le n$,求有多少个长度为 ...

最新文章

  1. LLVM IR 理解
  2. tomcat 修改默认访问根目录
  3. 前端性能测试详细分析(二)
  4. 用js实现分享到随页面滚动而滑动效果
  5. 2019-03-12-算法-进化(合并两个有序数组)
  6. IDEA里如何安装Python插件打造开发环境(图文详解)
  7. 南京信息工程大学c语言期末答案,南京信息工程大学试卷2011-2012(2)c语言程序设计试卷答案(文科)-a...
  8. 【Elasticsearch】7.9 单字段支持的最大字符数
  9. leetcode求众数
  10. python和json转换_python和json之间转化
  11. 卷积神经网络之迁移学习
  12. [HEOI2014]大工程
  13. java小游戏制作(maxfo)
  14. 【牛客网】滴滴出行2017秋招测试岗笔试真题汇总
  15. 将几个常用网站页面保存为PDF并删除网页无用部分
  16. 智慧路灯物联网解决方案
  17. linux7重置密码,centos7重置密码
  18. 《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)
  19. 影响中国青年的100句人生名言 1
  20. 【屏类型结构体定义PanelType】 文档位置:《apiPNL.h》

热门文章

  1. 微软企业库配置工具菜单Edit Enterprise Library V5 Configuration
  2. 开源-一步步实现cnblogs博客采集工具-对项目需求的分析
  3. 什么是HTTP Headers?
  4. 推荐 xiaotie 的开源GIS专题文章索引
  5. [HEOI2017] 相逢是问候
  6. 【Xamarin笔记】Events, Protocols and Delegates
  7. 新手谈谈网站交互设计
  8. APM之基于事件的异步模式(EAP)-2
  9. 算法---------简化路径(Java版本)
  10. Android线程间通信的几种实现方式