C++ 判断点是否在多边形内部的方法

24 篇文章 1 订阅

简述

在网上看到了很多种方法来判断“点是否在多边形内部”,最终选择了一种简单易懂,且适合所有多边形的方法--水平/垂直交叉点数判别法

方法

如果从点P作水平向左的射线的话,假设P在多边形内部,那么这条射线与多边形的交点必为奇数,如果P在多边形外部,则交点个数必为偶数(0也在内)。所以,我们可以顺序(顺时针或逆时针)考虑多边形的每条边,求出交点的总个数。还有一些特殊情况要考虑。假如考虑边(P1,P2),
1) 如果射线正好穿过P1或者P2,那么这个交点会被算作2次,处理办法是如果P的从坐标与P1,P2中较小的纵坐标相同,则直接忽略这种情况
2) 如果射线水平,则射线要么与其无交点,要么有无数个,这种情况也直接忽略。
3) 如果射线竖直,而P的横坐标小于P1,P2的横坐标,则必然相交。
4) 再判断相交之前,先判断P是否在边(P1,P2)的上面,如果在,则直接得出结论:P再多边形内部。

//作用:判断点是否在多边形内
//p指目标点, ptPolygon指多边形的点集合, nCount指多边形的边数
int BlobDetect::PtInPolygon (Point p, vector<cv::Point>& ptPolygon, int nCount)  
{  
	// 交点个数  
	int nCross = 0;  
	for (int i = 0; i < nCount; i++)   
	{  
		Point p1 = ptPolygon[i];  
		Point p2 = ptPolygon[(i + 1) % nCount];// 点P1与P2形成连线  

		if ( p1.y == p2.y )  
			continue;  
		if ( p.y < min(p1.y, p2.y) )  
			continue;  
		if ( p.y >= max(p1.y, p2.y) )  
			continue;  
		// 求交点的x坐标(由直线两点式方程转化而来)   

		double x = (double)(p.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;  

		// 只统计p1p2与p向右射线的交点  
		if ( x > p.x )  
		{  
			nCross++;  
		}  

	}  

	// 交点为偶数,点在多边形之外  
	// 交点为奇数,点在多边形之内
	if ((nCross % 2) == 1)
	{
		g_proj_log.ShowInfo("点在区域内");
		return BLOB_OK;
	}
	else
	{
		g_proj_log.ShowInfo("点在区域外");
		return BLOB_FAIL;
	}
} 

附上直线两点式方程式,如下图: 

最后,附上一篇我看到的关于“点在多边形内部”的博客,有兴趣的话可以研究下 。相关链接

  • 20
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值