【判定点是否在多边形内部】 ZOJ 1081

火焰之地传送门

【题目大意】给定一个点数为 n 的多边形,点按照顺序给出,再给出 m 个点,询问每个点是否在多边形内。 n <= 100

大概就是用射线法判断。特判一下三点共线。【参考博客】

#include<bits/stdc++.h>
using namespace std;
struct point{
	int x,y;
	point(int A=0,int B=0){
		x=A,y=B;
	}
	friend inline point operator -(const point &lhs,const point &rhs){
		return point(lhs.x-rhs.x,lhs.y-rhs.y);
	}
	friend inline point operator +(const point &lhs,const point &rhs){
		return point(lhs.x+rhs.x,lhs.y+rhs.y);
	}
	friend inline int operator *(const point &lhs,const point &rhs){
		return lhs.x*rhs.y-lhs.y*rhs.x;
	}
	friend inline int dot(const point &lhs,const point &rhs){
		return lhs.x*rhs.x+lhs.y*rhs.y;
	}
}a[23333],b;
int n,m;
inline bool check(){
	int sum=0;
	for(int i=0;i<n;++i){
		int d=(b-a[i])*(a[(i+1)%n]-a[i]);
		if(d==0){
			if(dot(a[i]-b,a[(i+1)%n]-b)<=0)
				return true;
		}
        //过b向右作一条射线。
		int d1=a[i].y-b.y;
		int d2=a[(i+1)%n].y-b.y;
		//只有满足下面的if,过b点的射线才能和这个多边形有交点。
		if(d>0&&d1<=0&&d2>0) sum++;
		if(d<0&&d2<=0&&d1>0) sum--;
	}
	if(sum!=0) return true;
	return false;
}
int main(){
	int t=0;
	while(scanf("%d",&n)!=EOF&&n){
		t++;
		scanf("%d",&m);
		if(t!=1) putchar('\n');
		printf("Problem %d:\n",t);
		for(int i=0;i<n;++i)
			scanf("%d%d",&a[i].x,&a[i].y);
		for(int i=1;i<=m;++i){
			scanf("%d%d",&b.x,&b.y);
			if(check())
				printf("Within\n");
			else
				printf("Outside\n");
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值