ZOJ 1081 Points Within( 判断点在多边形内外 )

/*************************************************************************
    > File Name: zoj1081.cpp
    > Author:    WArobot 
    > Blog:      http://www.cnblogs.com/WArobot/ 
    > Created Time: 2017年05月01日 星期一 14时47分03秒
 ************************************************************************/

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;

#define eps 1.0e-5
#define dou double

struct point{
	dou x;
	dou y;
}po[111];

int n,m;

bool online(point p1,point p,point p2){
	if( p.x<=max(p1.x,p2.x) && p.x>=min(p1.x,p2.x) && p.y<=max(p1.y,p2.y) && p.y>=min(p1.y,p2.y) ){
		if ( fabs(((p.x-p1.x)*(p2.y-p1.y) - (p.y-p1.y)*(p2.x-p1.x)))<=eps )
			return true;
	}
	return false;
}
bool inside(point p){
	int cnt = 0;
	dou xinter;
	point p1,p2;
	p1 = po[0];
	for(int i=1;i<=n;i++){
		p2 = po[i%n];
		if( online(p1,p,p2) )	return true;
		if( p.x<=max(p1.x,p2.x)  && p.y<=max(p1.y,p2.y) && p.y>min(p1.y,p2.y) ){
			if(p1.y!=p2.y){
				xinter = (p.y-p1.y)*(p1.x-p2.x)/(p1.y-p2.y) + p1.x;	// 理论上的最远距离
				if(p1.x==p2.x || p.x<=xinter)	cnt++;
			}
		}
		p1 = p2;
	}
	if(cnt%2==0)	return false;
	else			return true;
}

int main(){
	int kase = 0;
	point p;
	while(~scanf("%d",&n) && n){
		scanf("%d",&m);
	
		if(kase)	printf("\n");
	
		for(int i=0;i<n;i++)	scanf("%lf%lf",&po[i].x,&po[i].y);
		printf("Problem %d:\n",++kase);
		for(int i=0;i<m;i++){
			scanf("%lf%lf",&p.x,&p.y);
			if( inside(p) )		printf("Within\n");
			else				printf("Outside\n");
		}
	}
	return 0;
}
posted @ 2017-05-01 15:16  ojnQ  阅读(237)  评论(0编辑  收藏  举报