POJ 1474 半平面交
题意:
判断多边形是否存在核。
题解:
最终的交点数组中没有点则没有核。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cstring> 6 #include <cmath> 7 8 #define N 2222 9 #define EPS 1e-7 10 #define INF 1e9 11 12 using namespace std; 13 14 struct PO 15 { 16 double x,y; 17 }p[N],tp[N],s[N],o; 18 19 int n,cas; 20 21 inline void read() 22 { 23 for(int i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); 24 p[n+1]=p[1]; 25 } 26 27 inline PO operator -(PO a,PO b) 28 { 29 PO c; 30 c.x=a.x-b.x; 31 c.y=a.y-b.y; 32 return c; 33 } 34 35 inline int dc(double x) 36 { 37 if(x>EPS) return 1; 38 else if(x<-EPS) return -1; 39 return 0; 40 } 41 42 inline double cross(PO &a,PO &b,PO &c) 43 { 44 return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x); 45 } 46 47 inline double getarea(PO *a,int n)//多边形面积,逆时针为正 48 { 49 double res=0.0; 50 for(int i=1;i<=n;i++) res+=cross(o,a[i],a[i+1]); 51 return res*0.5; 52 } 53 54 inline PO getpoint(PO &a,PO &b,PO &c,PO &d)//直线交点 55 { 56 PO ans,tp=b-a; 57 double k1=cross(a,d,c); 58 double k2=cross(b,c,d); 59 ans.x=a.x+tp.x*k1/(k1+k2); 60 ans.y=a.y+tp.y*k1/(k1+k2); 61 return ans; 62 } 63 64 inline void change()//变顺时针为逆时针 65 { 66 for(int i=1;i<=(n>>1);i++) swap(p[i],p[n-i+1]); 67 p[n+1]=p[1]; 68 } 69 70 void prt(PO a) 71 { 72 printf("%lf %lf\n",a.x,a.y); 73 } 74 75 inline void getcut() 76 { 77 tp[1].x=tp[5].x=-INF,tp[1].y=tp[5].y=-INF; 78 tp[2].x=INF,tp[2].y=-INF; 79 tp[3].x=INF,tp[3].y=INF; 80 tp[4].x=-INF,tp[4].y=INF; 81 int cp=4,tc; 82 for(int i=1;i<=n;i++) 83 { 84 tc=0; 85 for(int j=1;j<=cp;j++) 86 { 87 if(dc(cross(p[i],p[i+1],tp[j]))>=0) s[++tc]=tp[j]; 88 if(dc(cross(p[i],p[i+1],tp[j])*cross(p[i],p[i+1],tp[j+1]))<0) 89 s[++tc]=getpoint(p[i],p[i+1],tp[j],tp[j+1]); 90 } 91 s[tc+1]=s[1]; 92 for(int j=1;j<=tc+1;j++) tp[j]=s[j]; 93 cp=tc; 94 } 95 n=cp; 96 } 97 98 inline void go() 99 { 100 change(); 101 getcut(); 102 if(n) printf("Floor #%d\nSurveillance is possible.\n\n",++cas); 103 else printf("Floor #%d\nSurveillance is impossible.\n\n",++cas); 104 } 105 106 int main() 107 { 108 while(scanf("%d",&n),n) read(),go(); 109 return 0; 110 }
没有人能阻止我前进的步伐,除了我自己!