POJ 2318 TOYS

简单计算几何,用叉积判断点是否在四边形内部。

 

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int maxn=5000+10;
int n,m,X1,Y1,X2,Y2;
int U[maxn],L[maxn];
int ans[maxn];
bool flag[maxn];
struct Point
{
    int x,y;
} p[maxn];

char s[10000];

void init()
{
    memset(flag,0,sizeof flag);
    memset(ans,0,sizeof ans);
}

int F(int a1,int b1,int a2,int b2)
{
    //返回向量(a1,b1)与向量(a2,b2)的叉积
    return a1*b2 - a2*b1;
}

bool judge(int a1,int b1,int a2,int b2,int a3,int b3,int a4,int b4,int A,int B)
{
    if(F(a2-a1,b2-b1,A-a1,B-b1)>0) return 0;
    if(F(a3-a2,b3-b2,A-a2,B-b2)>0) return 0;
    if(F(a4-a3,b4-b3,A-a3,B-b3)>0) return 0;
    if(F(a1-a4,b1-b4,A-a4,B-b4)>0) return 0;
    return 1;
}

int main()
{
    while(~scanf("%d",&n))
    {
        if(!n) break;
        scanf("%d%d%d%d%d",&m,&X1,&Y1,&X2,&Y2);
        init();
        for(int i=1; i<=n; i++) scanf("%d%d",&U[i],&L[i]);
        U[0]=X1;
        L[0]=X1;
        U[n+1]=X2;
        L[n+1]=X2;
        for(int i=1; i<=m; i++) scanf("%d%d",&p[i].x,&p[i].y);
        for(int i=0; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                if(flag[j]!=0) continue;
                if(judge(U[i],Y1,U[i+1],Y1,L[i+1],Y2,L[i],Y2,p[j].x,p[j].y))
                    flag[j]=1,ans[i]++;
            }
        }
        for(int i=0; i<=n; i++) printf("%d: %d\n",i,ans[i]);
        printf("\n");
    }
    return 0;
}

 

posted @ 2015-10-31 15:58  Fighting_Heart  阅读(128)  评论(0编辑  收藏  举报