射线法判断点是否在多边形里面

文章介绍了射线法用于判断一个点是否位于多边形内部的算法,通过计算点到多边形边界射线的交点数量来确定。如果交点数为奇数,点在多边形内;偶数则在多边形外。代码示例展示了如何处理点与顶点重合、线段两侧判断以及计算交点的过程。
摘要由CSDN通过智能技术生成

射线法

射线法是用被测点向任意方向(通常为了好算,使其射向右侧)做一条射线,判断射线与多边形的交点。如果交点的数量为奇数,则被测点在多边形内;如果交点的数量为偶数,则被测点在多边形以外。

使用实例

下面看下集中情况:
a点在多边形内
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
a点在多边形外
在这里插入图片描述
在这里插入图片描述

代码说明

1.点与多边形顶点重合

// 点与多边形的顶点重合
		if (((start.x == ref.x) && (start.y == ref.y)) || ((end.x == ref.x) && (end.y == ref.y)))
		{
			return true;
		}

2.判断线段两端点是否在射线两侧
在这里插入图片描述

if (((ref.y >= start.y)&&(ref.y < end.y)) || ((ref.y >= end.y)&&(ref.y < start.y)))

3.判断点是在线段的右边还是左边
在这里插入图片描述
现根据两点式直线方程求出a点的x值
两点式方程公式:(y-y1)/(y2-y1)=(x-x1)/(x2-x1)。

// 线段上与射线 Y 坐标相同的点的 X 坐标
x = start.x + (ref.y - start.y) * (end.x - start.x) / (end.y - start.y);

x值为a点出的x值,判断点ref是在线段的左边还是右边

// 射线穿过多边形的边界
if (x > ref.x)
{
	++count;
}

完成代码

// 射线法判断点在多边形的内部或外部
bool PtInPolygon(CPoint ref, TVA_Polygon poly)
{
	int i, j, n;
	n = poly.numPoints;
	long int x;
	int count = 0;
	CPoint start, end;

	if (0 == n)
	{
		return false;
	}


	for (i = 0, j = n-1; i < n; j = i++)
	{
		start.x = poly.points[i].x;
		start.y = poly.points[i].y;
		end.x = poly.points[j].x;
		end.y = poly.points[j].y;
		
		// 点与多边形的顶点重合
		if (((start.x == ref.x) && (start.y == ref.y)) || ((end.x == ref.x) && (end.y == ref.y)))
		{
			return true;
		}

		// 判断线段两端点是否在射线两侧
		if (((ref.y >= start.y)&&(ref.y < end.y)) || ((ref.y >= end.y)&&(ref.y < start.y)))
		{
			// 线段上与射线 Y 坐标相同的点的 X 坐标
			x = start.x + (ref.y - start.y) * (end.x - start.x) / (end.y - start.y);

			// 点在多边形的边上
			if (ref.x == x)
			{
				return true;	// onside
			}

			// 射线穿过多边形的边界
			if (x > ref.x)
			{
				++count;
			}
		}
	}

	// 射线穿过多边形边界的次数为奇数时点在多边形内
	return (count%2) ? true/*inside*/ : false/*outside*/;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

<( ̄︶ ̄)Okay.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值