您的位置:首页 > 其它

hlg1306再遇攻击--射线法判断点是否在多边形内部

2014-04-30 00:48 561 查看
再遇攻击
Time Limit: 1000 MSMemory Limit: 65536 K
Total Submit: 313(40 users)Total Accepted: 91(32 users)Rating:

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

const int maxn = 55;

int min(int a, int b)
{
return a > b ? b : a;
}
int max(int a, int b)
{
return a > b ? a : b;
}

struct point
{
int x;
int y;
}poin[maxn];

int cross(point p0, point p1, point p2)
{
return (p1.x - p0.x)*(p2.y - p0.y) - (p2.x - p0.x)*(p1.y - p0.y);
}

bool check_online(point p1, point p2, point Q)
{
if(cross(p1, Q, p2) == 0 &&
Q.x >= min(p1.x, p2.x) && Q.x <= max(p1.x, p2.x) &&
Q.y >= min(p1.y, p2.y) && Q.y <= max(p1.y, p2.y) )
return true;
return false;
}

bool check_two_line(point a,point b, point c, point d)
{
int h, i, j, k;
h = cross(a, b, c);
i = cross(a, b, d);
j = cross(c, d, a);
k = cross(c, d, b);
return h * i <= 0 && j * k <= 0;
}

int main()
{
int n;
while(scanf("%d",&n) && n)
{
point Q, P, p1, p2;
scanf("%d %d",&Q.x, &Q.y);
P.x = 101, P.y = Q.y;
for(int i = 0; i < n; i++)
scanf("%d %d",&poin[i].x, &poin[i].y);
bool flag = false;
int cnt = 0;
for(int i = 0; i < n; i++)
{
p1 = poin[i], p2 = poin[(i+1)%n];
if(check_online(p1, p2, Q))
{
flag = true;
break;
}
if(p1.y == p2.y)
continue;
if(Q.y > min(p1.y, p2.y) && Q.y <= max(p1.y, p2.y))
{
if(check_two_line(Q, P, p1, p2))
cnt++;
}
}
//printf("%d\n",cnt);
if(flag)
{
printf("Yes\n");
continue;
}
if(cnt % 2 == 1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: