SGU 124 Broken line(计算几何)

Description
给出一个封闭的折线,保证没有内部交叉或者接触(即可将其看作一个简单多边形),判断一个点与这个折线的位置关系(折线内,折线上,折线外)
Input
第一行为一整数n表示折线的段数,之后n行每行四个整数x1,y1,x2,y2表示折线的一段,最后两个整数x,y表示该点坐标(4<=n<=10000,-10000<=x1,y1,x2,y2,x,y<=10000)
Output
判断该点与折线的位置关系
INSIDE:折线内
BORDER:折线上
OUTSIDE:折线外
Sample Input
4
0 0 0 3
3 3 3 0
0 3 3 3
3 0 0 0
2 2
Sample Output
INSIDE
Solution
点是否在折线上很好判断,至于判断是否在折线内外可以从该点引一条朝上的射线,判断这个射线与折线的交点数,如果为偶数则该点在折线外,如果为奇数在该点在折线内
Code

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 11111
struct Line
{
    int x1,x2,y1,y2;
}l[maxn];
int n,x,y;
char table[3][10]={"BORDER","INSIDE","OUTSIDE"};
int check()
{
    int res=0;
    for(int i=0;i<n;i++)
    {
        int x1=l[i].x1,y1=l[i].y1,x2=l[i].x2,y2=l[i].y2;
        if(x1==x2&&x==x1&&y1<=y&&y<=y2)return 0;
        else if(y1==y2)
        {
            if(y==y1&&x1<=x&&x<=x2)return 0;
            if(y<y1&&x1<x&&x<=x2)res++;
        }
    }
    return 2-res%2;
}
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d%d%d%d",&l[i].x1,&l[i].y1,&l[i].x2,&l[i].y2);
            if(l[i].x1>l[i].x2)swap(l[i].x1,l[i].x2);
            if(l[i].y1>l[i].y2)swap(l[i].y1,l[i].y2);
        }
        scanf("%d%d",&x,&y);
        int ans=check();
        printf("%s\n",table[ans]);
    }
    return 0;
}

你可能感兴趣的:(SGU 124 Broken line(计算几何))