判断点是否在多边形内部(射线法)

有关射线法的详细介绍在这里给出一个讲的很好的博客链接:

https://blog.csdn.net/jq_develop/article/details/44981127

接着给出代码模板,以UVA-634作为模板测试,题目链接如下:

https://vjudge.net/problem/UVA-634

//写在前面
//判断点是否在多边形内部最好的方法就是射线法,在实际
//应用中有几种特殊情况需要处理
//1、点与多边形的顶点重合  2、点在多边形的一条边上
//另外需要注意的一点是:当射线穿过多边形的一个顶点时
//我们认为这个点是在射线的上方.只有当线段的两个顶点分别在
//射线的两侧时我们才认为射线与该多边形的这条线段有一个交点 
//这里以UVA-634作为样例进行说明 
#include <iostream>
#include <string.h>
#include <cmath>
#define maxn 1005
#define eps 1e-8
using namespace std;
struct node
{
	int x,y;
	node(int a,int b){x=a;y=b;}
	node(){};
};
int n;
node point[maxn];//保存多边形顶点数组 
bool solve(node yo)
{
	int ox=yo.x,oy=yo.y;
	int num=0;
	for(int i=0;i<n-1;i++)
	{
		int sx=point[i].x,sy=point[i].y;
		int ex=point[i+1].x,ey=point[i+1].y;
		if((ox==sx&&oy==sy)||(ox==ex&&oy==ey)){return true;}//判断点是否与多边形的顶点重合 
		
		if((sy>=oy&&ey<oy)||(ey>=oy&&sy<oy))//当线段的端点位于射线的上下两侧时 
		{
			double midx;
			midx=sx+(oy-sy)*(ex-sx)*1.0/(ey-sy);//计算直线与线段的交点 
			double rx=ox;
			if(fabs(midx-rx)<eps)//判断点是否在多边形的边上 
			{return true;}
			
			if(midx>rx)num++;
		}
	}
	if(num%2){return true;}//当与多边形有奇数个交点时 
	else return false;
}
int main()
{
	while(cin>>n&&n)
	{
		for(int i=0;i<n;i++)cin>>point[i].x>>point[i].y;
		node ver;
		cin>>ver.x>>ver.y;
		
		if(solve(ver))cout<<"T\n";
		else cout<<"F\n";
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值