poj2318(叉积判断点的位置+二分查找)

来源:互联网 发布:美少女梦工厂 mac 编辑:程序博客网 时间:2024/04/27 22:24

作为一个计算几何入门者,个人感觉是个好题

给定两点(x1,y1)、(x2,y2)确定的直线和一点(x,y),判断点在直线的左边还是右边

代码如下:

#include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#include<time.h>#include<math.h>#define eps 1e-9#define pi acos(-1.0)#define N 5000+10#define P system("pause")using namespace std;struct point {    double x,y;       };double a[N],b[N];  //记录每条直线int c[N];//记录每个块中玩具的数目double cross(point A,point B)//叉积{     return A.x*B.y-A.y*B.x;       }int main(){//freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);    int n,m,i;    double x1,y1,x2,y2;    while(scanf("%d",&n) && n)    {         memset(c,0,sizeof(c));         scanf("%d%lf%lf%lf%lf",&m,&x1,&y1,&x2,&y2);         for(i=1;i<=n;i++)            scanf("%lf%lf",&a[i],&b[i]);         a[0]=x1;a[n+1]=x2;         b[n+1]=x1; b[n+1]=x2;         double x,y;         for(i=0;i<m;i++)         {               scanf("%lf%lf",&x,&y);             int left=0,right=n+1;            while(left<right)  //二分查找  这只是一种写法,个人喜欢这样写            {                   int mid=(left+right)/2;                   point v,w;                  // v.x=a[mid]-b[mid];v.y=y1-y2;                   v.x=a[mid]-x;v.y=y1-y;                   //w.x=x-b[mid];w.y=y-y2;                  w.x=b[mid]-x;w.y=y2-y;                   if(cross(w,v) > eps)//点在直线左边                       right=mid;                   else left=mid+1;            }                      c[left]++;         }                       for(i=0;i<=n;i++)           printf("%d: %d\n",i,c[i+1]);         printf("\n");    }      //    P;                                   return 0;    }

0 0
原创粉丝点击