判断一个点是否在多边形内有几种不同的思路:
- 射线法:从判断点向某个统一方向作射线,依交点个数的奇偶判断;
- 转角法:按照多边形顶点逆时针顺序,根据顶点和判断点连线的方向正负(设定角度逆时针为正)求和判断;
- 夹角和法:求判断点与所有边的夹角和,等于360度则在多边形内部。
- 面积和法:求判断点与多边形边组成的三角形面积和,等于多边形面积则点在多边形内部。
面积和法涉及多个面积的计算,比较复杂,夹角和法以及转角法用到角度计算,会涉及反三角函数,计算开销比较大,而射线法主要涉及循环多边形的每条边进行求交运算,但大部分边可以通过简单坐标比对直接排除,因此这是比较好的方法。
射线法的原理
射线法就是以判断点开始,向右(或向左)的水平方向作一射线,计算该射线与多边形每条边的交点个数,如果交点个数为奇数,则点位于多边形内,偶数则在多边形外。该算法对于复合多边形也能正确判断。
射线与边相交
射线法的关键是正确计算射线与每条边是否相交。并且规定线段与射线重叠或者射线经过线段下端点属于不相交。首先排除掉不相交的情况,下图的情况都是需要排除掉的:
排除掉上述情况真正需要求交点来判断的情况只有两种:
用python实现代码如下:
函数isRayIntersectsSegment()
里求交点的部分就是利用两个三角形的比例关系求出交点在起点的左边还是右边;用图去理解如下:
判断点在多边形内
接下来遍历多边形的每条边,统计交点个数就可以判断点是否在多边形内了。
python实现代码如下:
测试
最后我们可以测试一下
参考
https://www.jianshu.com/p/ba03c600a557
感谢这篇文章,虽然代码有错但是我改过来了: