您的位置:首页 > 其它

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

2014-03-09 23:20 435 查看
作为一个计算几何入门者,个人感觉是个好题

给定两点(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
,b
;  //记录每条直线
int c
;//记录每个块中玩具的数目
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;    
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: