POJ2318+几何+判点在四边形内

View Code
  1 /*
  2 几何+判断点在四边形内
  3 */
  4 #include<stdio.h>
  5 #include<string.h>
  6 #include<stdlib.h>
  7 #include<algorithm>
  8 #include<iostream>
  9 #include<queue>
 10 //#include<map>
 11 #include<math.h>
 12 using namespace std;
 13 typedef long long ll;
 14 //typedef __int64 int64;
 15 const int maxn = 5405;
 16 const int inf = 0x7fffffff;
 17 const double pi=acos(-1.0);
 18 const double eps = 1e-8;
 19 struct point {
 20     double x,y;
 21 };
 22 struct Rect{
 23     point a,b,c,d;
 24 };
 25 Rect rect[ maxn ];
 26 double pos[ maxn ];
 27 int cnt[ maxn ];
 28 double xmult( point sp,point ep,point op ){
 29     return ( sp.x-op.x )*( ep.y-op.y )-( sp.y-op.y )*( ep.x-op.x );
 30 }
 31 bool point_in_rect( point p,Rect s ){
 32     if( xmult( s.d,s.a,p )<-eps ) return false;
 33     if( xmult( s.a,s.b,p )<-eps ) return false;
 34     if( xmult( s.b,s.c,p )<-eps ) return false;
 35     if( xmult( s.c,s.d,p )<-eps ) return false;
 36     return true;
 37 }//判断点是否在Rect这个四边形中
 38 int main(){
 39     int n;
 40     int ca = 0;
 41     while( scanf("%d",&n)==1 ){
 42         if( n==0 ) break;
 43         if( ca==0 ) ca++;
 44         else printf("\n");
 45         int m;
 46         scanf("%d",&m);
 47         double x1,x2,y1,y2;
 48         scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
 49         double tx1,tx2;
 50         point pre_up,pre_down;
 51         pre_up.x = x1;
 52         pre_up.y = y1;
 53         pre_down.x = x1;
 54         pre_down.y = y2;
 55         for( int i=0;i<n;i++ ){
 56             scanf("%lf%lf",&tx1,&tx2);
 57             rect[ i ].a.x = pre_up.x;
 58             rect[ i ].a.y = pre_up.y;
 59             rect[ i ].b.x = pre_down.x;
 60             rect[ i ].b.y = pre_down.y;
 61             pre_up.x = tx1;
 62             pre_down.x = tx2;
 63             rect[ i ].d.x = pre_up.x;
 64             rect[ i ].d.y = pre_up.y;
 65             rect[ i ].c.x = pre_down.x;
 66             rect[ i ].c.y = pre_down.y;
 67             pos[ i ] = min( rect[ i ].a.x,rect[ i ].b.x );//pos记录每个四边形的x的最小值!!!
 68         }
 69         rect[ n ].a.x = pre_up.x;
 70         rect[ n ].a.y = pre_up.y;
 71         rect[ n ].b.x = pre_down.x;
 72         rect[ n ].b.y = pre_down.y;
 73         pre_up.x = x2;
 74         pre_down.x = x2;
 75         rect[ n ].d.x = pre_up.x;
 76         rect[ n ].d.y = pre_up.y;
 77         rect[ n ].c.x = pre_down.x;
 78         rect[ n ].c.y = pre_down.y;
 79         pos[ n ] = min( rect[ n ].a.x,rect[ n ].b.x );
 80         memset( cnt,0,sizeof( cnt ) );
 81         point tmp;
 82         /*
 83         for( int i=0;i<=n;i++ ){
 84             printf("%d:\n",i);
 85             printf("[%lf %lf][%lf %lf]\n [%lf %lf][%lf %lf]\n\n",rect[i].a.x,rect[i].a.y,rect[i].b.x,rect[i].b.y,rect[i].c.x,rect[i].c.y,rect[i].d.x,rect[i].d.y);
 86         }
 87         
 88         for( int i=0;i<=n;i++ )
 89             printf("%lf\n",pos[ i ]);
 90         */
 91         for( int num=1;num<=m;num++ ){
 92             scanf("%lf%lf",&tmp.x,&tmp.y);
 93             /*
 94             for( int i=0;i<=n;i++ ){
 95                 if( (tmp.x>=min(rect[i].a.x,rect[i].b.x))&&point_in_rect( tmp,rect[ i ] )==true ){
 96                     cnt[ i ]++;
 97                     //printf("%d:%d\n",num,i);
 98                     break;
 99                 }
100             }
101             */
102             int pos_s;
103             pos_s = lower_bound( pos,pos+n+1,tmp.x ) - pos;
104             //printf("num:%d %d\n",num,pos_s);
105             for( int i=min(n,pos_s+1);i>=0;i-- ){
106                 if( point_in_rect( tmp,rect[ i ] )==true ){
107                     cnt[ i ]++;
108                     //printf("%d:%d\n",num,i);
109                     break;
110                 }
111             }
112         }
113         
114         for( int i=0;i<=n;i++ ){
115             printf("%d: %d\n",i,cnt[ i ]);
116         }
117         //if( ca ) printf("\n");
118     }
119     return 0;
120 }

 

 

posted @ 2013-03-23 15:23  xxx0624  阅读(209)  评论(0编辑  收藏  举报