sgu124 分类: sgu 2015-02-15 16:02 56人阅读 评论(0) 收藏
射线法
首先可以直接判断点是否在边上,
若不在,从点出发,向任意方向作一条射线,
统计射线与边相交的次数
若为奇数次,则在多边形内
若为偶数次,则在多边形外
#include<stdio.h>
#include<stdlib.h>
#define MAXN 10005
struct edge
{
int x1,x2,y1,y2;
}mp[MAXN]={0};
int n,xx,yy;
struct edge adjust(struct edge a)
{
int swap;
if(a.y1>a.y2){swap=a.y1,a.y1=a.y2,a.y2=swap;}
if(a.x1>a.x2){swap=a.x1,a.x1=a.x2,a.x2=swap;}
return a;
}
int main()
{
int i,j;
int flag,cnt;
#ifndef ONLINE_JUDGE
freopen("sgu124.in","r",stdin);
freopen("sgu124.out","w",stdout);
#endif
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d%d%d",&mp[i].x1,&mp[i].y1,&mp[i].x2,&mp[i].y2);
mp[i]=adjust(mp[i]);
}
scanf("%d%d",&xx,&yy);
for(i=1,flag=0;i<=n;i++)
{
if(mp[i].x1==mp[i].x2)
{
if(mp[i].x1==xx && mp[i].y1<=yy && yy<=mp[i].y2)
{
flag=1;break;
}
}
else//mp[i].y1==mp[i].y2
{
if(mp[i].y1==yy && mp[i].x1<=xx && xx<=mp[i].x2)
{
flag=1;break;
}
}
}
if(!flag)
{
for(i=1,cnt=0;i<=n;i++)
{
if(mp[i].x1==mp[i].x2)
{
// mp[i].y1 < y0 <= mp[i].y2
if(xx<mp[i].x1 && mp[i].y1<yy && yy<=mp[i].y2)
{
cnt++;
}
}
}
if(cnt&1)printf("INSIDE");
else printf("OUTSIDE");
}
else
printf("BORDER");
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。