zoukankan      html  css  js  c++  java
  • 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 }
    keep moving...
  • 相关阅读:
    SQL Server控制语句
    MATLAB中取整函数(fix, floor, ceil, round)的使用
    MATLAB程序设计
    Thinking In Java<<Java编程思想>>
    Boost::bimap
    MySQL学习随笔1
    Boost 1_42_0在windows下的编译及其设置
    MySQL执行mysql脚本及其脚本编写
    Pygame介绍
    Erlang
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2977239.html
Copyright © 2011-2022 走看看