【题目大意】给定一个点数为 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");
}
}
}