作为一个计算几何入门者,个人感觉是个好题
给定两点(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;
}