poj 2318 TOYS--点在直线左侧还是右侧

/*
poj 2318 TOYS
简单的计算几何

就是一个矩形的范围 被n条线段分成n+1个区域
然后有m个点的坐标,他们归属于所在的区域

然后输出各区域内点的个数

就是算一下点是在线段左侧还是右侧

用向量的叉积即可

保证线段所在的向量的x>0
那么  叉积>0  点在左侧
      叉积<0  点在右侧

二分求解即可
*/
#include<stdio.h>
struct point
{
	int x,y;
};
struct zone
{
	point s,x;
	int n;
}l[5050];
int n,m,x1,x2,y1,y2;
int cross(point p,point s,point e)
{
	return (e.x-s.x)*(p.y-s.y)-(p.x-s.x)*(e.y-s.y);
}
int main()
{
	int i,a,b,max,min,mid,cas=0;
	point z;
	while(scanf("%d",&n),n)
	{
		scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
		l[0].s.x=x1,l[0].s.y=y1,l[0].x.x=x1,l[0].x.y=y2,l[0].n=0;
		l[n+1].s.x=x2,l[n+1].s.y=y1,l[n+1].x.x=x2,l[n+1].x.y=y2,l[n+1].n=0;

		for(i=1;i<=n;i++)
		{
			scanf("%d%d",&a,&b);
			l[i].s.x=a,l[i].s.y=y1,l[i].x.x=b,l[i].x.y=y2,l[i].n=0;
		}

		for(i=1;i<=m;++i)
		{
			scanf("%d%d",&a,&b);
			z.x=a,z.y=b;
			min=0,max=n+1;
			while(min+1<max)
			{
				mid=(min+max)/2;
				if(cross(z,l[mid].x,l[mid].s)>0)
					max=mid;
				else min=mid;
			}
			l[min].n++;
		}
		if(cas++)
			printf("\n");
		for(i=0;i<=n;i++)
			printf("%d: %d\n",i,l[i].n);
	}
	return 0;
}

你可能感兴趣的:(struct)