您的位置:首页 > 其它

HDU 1756 判断一个点是否在多边形内

2015-06-12 02:59 267 查看
原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=1756

题意:判断一个点在不在多边形内(点在边上输出的是Yex)

但是我自己有几个没理解的问题:

1,为什么建立新坐标系之后等于0的坐标把它看做是大于零的’

2.。为什么最后的sum!=0就是在多边形内呢?

希望理解这个思路的朋友联系我吧:QQ:756925010

代码如下:

#include<iostream>
#include<cmath>
int n, m;
struct Point{
int x, y;
}point[101],point1[101],start;
int q[101];
int quadrant(Point a){
if (a.x >= 0){
if (a.y >= 0) return 1;
else return 4;
}
else
{
if (a.y >= 0) return 2;
else return 3;
}
}
int cross(Point a,Point b){
return a.x*b.y - b.x*a.y;
}
void process(){
for (int i = 0; i < n; i++){
//处理数据,建立新坐标
point1[i].x = point[i].x-start.x;
point1[i].y = point[i].y-start.y;
//特判
if (point1[i].x == 0 && point1[i].y == 0){
printf("Yes\n");
return;
}
//求象限(这个是解题的关键)
q[i]=quadrant(point1[i]);
}
int sum = 0;
//处理最后一个点和第一个点的关系
q
= q[0];
point1
= point1[0];
//处理最后一个点和第一个点的关系
for (int i = 0; i < n; i++){
int k = 1;
//同一个象限
if (q[i] == q[i + 1]) continue;
//跨了两个象限
if (abs(q[i + 1] - q[i]) == 2) k = 2;
//求叉积
if (cross(point1[i], point1[i + 1]) >= 0)
sum += k;
else
sum -= k;
}
if (sum != 0)
printf("Yes\n");
else
printf("No\n");
}
void init(){

}
int main(){
while (scanf("%d", &n) != EOF){
init();
for (int i = 0; i < n; i++){
scanf("%d%d", &point[i].x, &point[i].y);
}
int m;
scanf("%d", &m);
while (m--){
scanf("%d%d", &start.x, &start.y);
process();
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: