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; 
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-02-15 16:02  <Dash>  阅读(128)  评论(0编辑  收藏  举报