F1120——计算几何——多边形内点

 1  // Accepted 1120 C++ 0.02s 190K 054100526 FZU
 2 
 3  // 点在多边形内
 4  // 不满足 z=px+qy 的个数为(p-1)*(q-1)/2
 5 
 6  #include  < stdio.h >
 7  #include  < stdlib.h >
 8  #include  < string .h >
 9 
10  #define  offset 10000
11  #define  eps 1e-8
12  #define  zero(x) (((x)>0?(x):-(x))<eps)
13  #define  _sign(x) ((x)>eps?1:((x)<-eps?2:0))
14  const   int  INF  =   99999999  ;
15  const   int  size  =   20  ;
16 
17  struct  point
18  {
19       double  x ;
20       double  y ;
21  };
22  struct  point pt[size] ;
23 
24  double  minx, miny ;
25  double  maxx, maxy ;
26  int  inn ;  int  inp, inq ;  int  ct ;
27 
28  void  input() 
29  {
30      minx  =  miny  =  INF ;    maxx  =  maxy  =   - 1 * INF ;
31       for int  i = 0 ; i < inn; i ++  )
32      {
33          scanf(  " %lf %lf " & pt[i].x,  & pt[i].y ) ;
34           // if( minx > pt[i].x ) minx = pt[i].x ;
35           // if( miny > pt[i].y ) miny = pt[i].y ;
36 
37           // if( maxx < pt[i].x ) maxx = pt[i].x ;
38           // if( maxy < pt[i].x ) maxy = pt[i].y ;
39      }    
40  }
41 
42  double  xmult(point p1,point p2,point p0){
43       return  (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
44  }
45 
46  // 判点在任意多边形内,顶点按顺时针或逆时针给出
47  // on_edge表示点在多边形边上时的返回值,offset为多边形坐标上限
48  int  inside_polygon(point q, int  n,point *  p, int  on_edge = 1 ){
49      point q2;
50       int  i = 0 ,count;
51       while  (i < n)
52           for  (count = i = 0 ,q2.x = rand() + offset,q2.y = rand() + offset;i < n;i ++ )
53               if  (zero(xmult(q,p[i],p[(i + 1 ) % n])) && (p[i].x - q.x) * (p[(i + 1 ) % n].x - q.x) < eps && (p[i].y - q.y) * (p[(i + 1 ) % n].y - q.y) < eps)
54                   return  on_edge;
55               else   if  (zero(xmult(q,q2,p[i])))
56                   break ;
57               else   if  (xmult(q,p[i],q2) * xmult(q,p[(i + 1 ) % n],q2) <- eps && xmult(p[i],q,p[(i + 1 ) % n]) * xmult(p[i],q2,p[(i + 1 ) % n]) <- eps)
58                  count ++ ;
59       return  count & 1 ;
60  }
61 
62  void  process()
63  {
64      scanf(  " %d %d " & inp,  & inq ) ;
65 
66       struct  point q ; q.x  =   0.0  ; q.y  =   0.0  ;
67 
68       if ( inside_polygon( q, inn, pt,  1  ) )
69      {
70          printf(  " The pilot is in danger!\n "  ) ;
71          printf(  " The secret number is %d.\n " , (inp - 1 ) * (inq - 1 ) / 2  ) ;
72      }
73       else
74      {
75          printf(  " The pilot is safe.\n "  ) ;
76      }
77      printf(  " \n "  ) ;
78  }
79 
80  int  main()
81  {
82       // freopen( "in.txt", "r", stdin ) ;
83 
84      ct  =   1  ;
85       while ( scanf(  " %d " & inn )  !=  EOF  &&  inn )
86      {
87          printf(  " Pilot %d\n " , ct ++  ) ;
88 
89          input() ;
90 
91          process() ;
92 
93           // output() ;
94      }
95 
96       return   0  ;
97  }

你可能感兴趣的:(F1120——计算几何——多边形内点)