poj 3335 Rotating Scoreboard 半平面交

http://poj.org/problem?id=3335

给定一个多边形,判断是否存在核,点顺时针给出。
半平面交模板直接用。

 1 #include<cmath>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 const double MAX =100000000;
 6 const double pi =acos(-1.0);
 7 const double eps=1e-8;
 8 int m,s;
 9 struct node
10 {
11     double x,y; //注意类型
12 }tr[110],p[110],q[110];
13 int sig(double k)
14 {
15     return (k<-eps)?-1:(k>eps);
16 }
17 void interect(node x,node y,double a,double b,double c)
18 {
19     double u=fabs(a*x.x+b*x.y+c);
20     double v=fabs(a*y.x+b*y.y+c);
21     q[++s].x=(x.x*v+y.x*u)/(u+v);
22     q[s].y=(x.y*v+y.y*u)/(u+v);
23 }
24 //利用半平面切割
25 void cut(double a,double b,double c)
26 {
27     s=0;
28     int i;
29     for(i=1;i<=m;i++) //遍历所有顶点是否能观察到该边
30     {
31         if(sig(a*p[i].x+b*p[i].y+c)>=0)//因为线段是顺时针给出的,如果是逆时针就是<=0
32         {
33             q[++s]=p[i]; //若是则存储
34         }
35         else
36         {
37             if(sig(a*p[i-1].x+b*p[i-1].y+c)>0)//逆时针就是<0
38                 interect(p[i-1],p[i],a,b,c);
39             if(sig(a*p[i+1].x+b*p[i+1].y+c)>0)//逆时针就是<0
40                 interect(p[i+1],p[i],a,b,c);
41         }
42     }
43     //最后的p数组存放半平面的点集合
44     for(i=1;i<=s;i++) 
45         p[i]=q[i];
46     p[s+1]=p[1],p[0]=p[s];
47     m=s;
48 }
49 
50 int main()
51 {
52     int n,i,j,t;
53     scanf("%d",&t);
54     while(t--)
55     {
56         scanf("%d",&n);
57         for(i=0;i<n;i++)
58         {
59             scanf("%lf%lf",&tr[i].x,&tr[i].y);
60             p[i+1]=tr[i]; //初始化边界
61         }
62         tr[n]=tr[0];
63         p[n+1]=p[1];p[0]=p[n];
64         m=n;
65         double a,b,c;
66         for(i=0;i<n;i++)
67         {
68             a=tr[i+1].y-tr[i].y; //计算出相邻两点所在直线ax+by+c=0
69             b=tr[i].x-tr[i+1].x;
70             c=tr[i+1].x*tr[i].y-tr[i].x*tr[i+1].y;
71             cut(a,b,c);
72         }
73         if(!m) puts("NO");//这里如果有一个点,或者一条线段都可以,所以判断m是不是等于0就行了,不用判断面积
74         else puts("YES");
75     }
76     return 0;
77 }

 


 
posted @ 2011-05-06 21:32  CoderZhuang  阅读(123)  评论(0编辑  收藏  举报