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

原题地址: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值