给出一个矩形范围,给出n条线段,这n条线段一定与矩形上下边界相交且互不相交,将矩形分成n+1个划分。给出m个玩具的坐标。求每个划分放的玩具数,玩具保证不会在线段和左右边界上。
分析:
判断点是否在两条直线中间,利用叉积,如果在两条直线间,必定会有两个叉积一个小于0,一个大于0(不能把相乘小于0作为判断条件)
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
struct Dian
{
int x,y;
};
struct Line
{
Dian a,b;
}line[5001];
int n,m,total[5001];
// 求叉积p0p1 叉乘 p0p2 大于0 说明p1在 p0p2的左侧
int chaji(Dian p0,Dian p1,Dian p2)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
void judge(Dian d)
{
int i;
// 从第一条线向后遍历,如果点在该线左面,则该下标total++
for(i=0;i<n;++i)
{
//
if(chaji(line[i].a,d,line[i].b)<0) continue;
else
{
++total[i];
return;
}
}
// 找到最后都没找到,就是在最后一个区域
++total[n];
return;
}
int main(){
freopen("in.txt","r",stdin);
Dian left_up,right_low,temp;
int x1,x2,y1,y2;
int i;
while(cin>>n && n)
{
cin>>m>>left_up.x>>left_up.y>>right_low.x>>right_low.y;
memset(total,0,sizeof(total));
for(i=0;i<n;++i)
{
cin>>line[i].a.x>>line[i].b.x;
line[i].a.y=left_up.y;
line[i].b.y=right_low.y;
}
for(i=0;i<m;++i)
{
cin>>temp.x>>temp.y;
judge(temp);
}
// 输出格式
for(i=0;i<=n;++i)
cout<<i<<": "<<total[i]<<endl;
cout<<endl;
}
return 0;
}