POJ2318计算几何

来源:互联网 发布:虚拟机nat网络不稳定 编辑:程序博客网 时间:2024/05/13 16:18

POJ2318

题意:一个矩形被分为n+1块,每个玩具都有坐标,求玩具在哪个块里面;

我一开始,没完全理解叉积,把叉积的方向弄错了;

 

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct Point{    double x,y;}point[5005];struct Line{    Point a,b;}line[5005];double cross(Point p0,Point p1,Point p2) //p0在p1p2的什么方向,而不是p0在p2p1的方向,注意{    return (p0.x-p1.x)*(p2.y-p1.y)-(p2.x-p1.x)*(p0.y-p1.y);}int box[5005];int main(){    int n,m,cc=0;    double x1,y1,x2,y2;    while( scanf("%d",&n)&&n )    {        if( cc )           cout<<endl;        cc=1;        memset(box,0,sizeof(box));        scanf("%d%lf%lf%lf%lf",&m,&x1,&y1,&x2,&y2);        for(int i=1;i<=n;i++)        {            double U,L;            scanf("%lf%lf",&U,&L);            line[i].a.x=U;line[i].a.y=y1;            line[i].b.x=L;line[i].b.y=y2;        }        line[0].a.x=x1;line[0].a.y=y1;        line[0].b.x=x1;line[0].b.y=y2;        line[n+1].a.x=x2;line[n+1].a.y=y1;        line[n+1].b.x=x2;line[n+1].b.y=y2;        for(int i=1;i<=m;i++)        {            double x,y;            scanf("%lf%lf",&x,&y);            point[i].x=x;            point[i].y=y;        }        for(int i=1;i<=m;i++)        {            int l=0,r=n+1,flag=0;            while( l!=r&&(l+1)!=r )            {                int mid=(l+r)/2;                double k=cross(point[i],line[mid].b,line[mid].a); //叉积方向不能错了;                if( k<0 )                    r=mid;                else                    l=mid;                //printf("%d %d %d %.2lf\n",l,r,mid,k);            }            box[l]++;        }        for(int i=0;i<=n;i++)        {            printf("%d: %d\n",i,box[i]);        }    }    return 0;}

原创粉丝点击