1.前言:
在GIS开发中,经常会遇到确定一个坐标点是否在一块区域的内部这一问题。
如果这个问题不是一个单纯的数学问题,例如:在判断DEM、二维图像像素点、3D点云点等含有自身特征信息的这些点是否在一个区域范围内部的时候,可以结合其高程信息、RGB信息、深度信息来辅助处理,相比与单纯从数学角度来看更简单、快速。
举几个我认为正确的例子:SLAM中前端角点的选取,利用的是OpenCV来提取;DEM提取边界,根据周围高程的有无;PS中扣出某物边界,利用的是RGB差异性;点云提取可以利用深度信息(本质也是RGB)来做。
但是,如果我现在只拥有点的坐标,该问题就变成一个数学问题了。
2.射线法
该算法基本思路是从待定点朝任意方向射出一条射线(通常是水平向右),判断该射线与多边形边的交点个数。一般来说,交点个数为偶数(包括0),点在外部;交点个数为奇数,点在内部。
射线的朝向,对于最终的交点个数,也就是位置结果是没有影响的。
2.1算法介绍
在平面中待定点P与某边界的位置关系有三种,以P的纵坐标y这个高度来看,做一条直线y=yp,会与边界交于一个点。P可能在交点的左侧、右侧和交点上。
首先要满足,y一定要限制在yi和yi+1范围内,当然Vi和Vi+1两种情况有大小,所以是两个条件成或关系;最后看x和x交的关系,小于算交点。
当然也会遇到特殊情况,
比如P的射线刚好与Vi这个顶点相交:可以略微调整Vi的y值:
# 如果点与顶点高度相同,略微调整 y 值
if y == y1 or y == y2:
y += 1e-10
比如P的射线与水平边重合了: