原题地址: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[n] = q[0];
point1[n] = 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;
}