POJ3335(判断多边形内核是否存在)
来源:互联网 发布:2017年网络剧 编辑:程序博客网 时间:2024/05/21 09:07
题目:Rotating Scoreboard
题意:题目要求判断多边形内核是否存在,若存在就输出YES,不存在就输出NO,本题和POJ1474一样。本题点的输入顺序是顺时针方向。
/*Goujinping 2013.4.12 NEFUThe masterplate of Polygon kernel.Now the global variable Area stand for the area of Polygon kernelIn most case,the problem let us judge whether the Polygon kernelexist or not and calculate the area,perimeter,or other constantsabout the Polygon kernel.*/#include <math.h>#include <stdio.h>#include <iostream>#include <algorithm>using namespace std;const int N=11111;const double EPS = 1e-8;typedef double DIY;DIY Area,Length;struct Point{ DIY x,y; Point() {} Point(DIY _x,DIY _y):x(_x),y(_y) {}} p[N];Point MakeVector(Point &P,Point &Q){ return Point(Q.x-P.x,Q.y-P.y);}DIY CrossProduct(Point P,Point Q){ return P.x*Q.y-P.y*Q.x;}DIY MultiCross(Point P,Point Q,Point R){ return CrossProduct(MakeVector(Q,P),MakeVector(Q,R));}struct halfPlane{ Point s,t; DIY angle; halfPlane() {} halfPlane(Point _s,Point _t):s(_s),t(_t) {} halfPlane(DIY sx,DIY sy,DIY tx,DIY ty):s(sx,sy),t(tx,ty) {} void GetAngle() { angle=atan2(t.y-s.y,t.x-s.x); }} hp[N],q[N];Point IntersectPoint(halfPlane P,halfPlane Q){ DIY a1=CrossProduct(MakeVector(P.s,Q.t),MakeVector(P.s,Q.s)); DIY a2=CrossProduct(MakeVector(P.t,Q.s),MakeVector(P.t,Q.t)); return Point((P.s.x*a2+P.t.x*a1)/(a2+a1),(P.s.y*a2+P.t.y*a1)/(a2+a1));}bool cmp(halfPlane P,halfPlane Q){ if(fabs(P.angle-Q.angle)<EPS) return MultiCross(P.s,P.t,Q.s)>0; return P.angle<Q.angle;}bool IsParallel(halfPlane P,halfPlane Q){ return fabs(CrossProduct(MakeVector(P.s,P.t),MakeVector(Q.s,Q.t)))<EPS;}void HalfPlaneIntersect(int n,int &m){ sort(hp,hp+n,cmp); int i,l=0,r=1; for(m=i=1; i<n; ++i) if(hp[i].angle-hp[i-1].angle>EPS) hp[m++]=hp[i]; n=m; m=0; q[0]=hp[0];q[1]=hp[1]; for(i=2; i<n; i++) { if(IsParallel(q[r],q[r-1])||IsParallel(q[l],q[l+1])) return; while(l<r&&MultiCross(hp[i].s,hp[i].t,IntersectPoint(q[r],q[r-1]))>0) --r; while(l<r&&MultiCross(hp[i].s,hp[i].t,IntersectPoint(q[l],q[l+1]))>0) ++l; q[++r]=hp[i]; } while(l<r&&MultiCross(q[l].s,q[l].t,IntersectPoint(q[r],q[r-1]))>0) --r; while(l<r&&MultiCross(q[r].s,q[r].t,IntersectPoint(q[l],q[l+1]))>0) ++l; q[++r]=q[l]; for(i=l; i<r; ++i) p[m++]=IntersectPoint(q[i],q[i+1]);}void Solve(Point *p,int n,int &m){ int i,j; p[n]=p[0]; for(i=0;i<n;i++) { hp[i]=halfPlane(p[(i+1)%n],p[i]); hp[i].GetAngle(); } HalfPlaneIntersect(n,m);}int main(){ int n,m,t; cin>>t; while(t--) { cin>>n; for(int i=0; i<n; i++) cin>>p[i].x>>p[i].y; Solve(p,n,m); if(m<3) puts("NO"); else puts("YES"); } return 0;}
- POJ3335(判断多边形内核是否存在)
- 判断多边形的核是否存在 poj3130&&poj3335
- poj3335-Rotating Scoreboard 判断多边形是否有内核(模板题)
- POJ3130(还是判断多边形的内核是否存在)
- POJ3335Rotating Scoreboard【半平面交判断多边形是否存在内核】
- 计算几何--(半平面判断多边形是否存在内核以及内核面积计算)
- 计算几何_判断多边形是否存在,及面积大小
- POJ 3335 判断一个多边形是否存在核
- windows内核判断文件是否存在的方法
- poj1474Video Surveillance【半平面交判断内核是否存在】
- zoj 1248 || poj 1474 Video Surveillance(判断多边形是否存在核)
- ZOJ1248/POJ1474/HDU1469 Video Surveillance(判断多边形是否存在核,计算几何)
- POJ 3335(半平面交—判断多边形的核是否存在)
- 判断多边形是否为平行四边形
- 判断文件是否存在
- 判断文件夹是否存在
- 判断用户是否存在
- 判断文件是否存在
- uImage 和zImage的微小区别
- 参加河北省自考之感悟
- iscntrl
- PC业在加速崩塌,迎来史上最坏季度
- 谈谈你对计算机硬件的发展趋势的看法。
- POJ3335(判断多边形内核是否存在)
- Android App开发记录 —配置文件的功能
- CentOS下安装php
- 复数的加法(友元函数)
- codeforce 67C - Sequence of Balls(dp)
- spring aop 同一个类中一个方法调用另一个方法,拦截不到被调用的方法
- 周鸿祎:微信已经从精神上把运营商干掉了
- NYOJ21 三个水杯
- linux学习笔记(一)—— vmwaretools实现ubuntu11.10虚拟机与win7主机文件共享