判断点P是否在多边形中时计算几何中一个非常重要基本的算法。
方法一是:
用带符号的三角形面积之和与多边形面积进行比较,这种算法由于使用浮点运算所以会带来一定的误差,
首先取目标点和多边形任意一条边构成三角形,三角形的符号这样确定,假设以多边形每个顶点逆时针顺序为正方向,按照这个方向每条边都是一个向量,当目标点在多边形某条边向量左边时,目标点和这条边构成的三角形的面积为正,当目标点在多边形某条边向量的右边时,目标点和这条边构成的三角形的面积为负
取目标点和多边形所有边构成的带符号三角形的面积之和假设为S,然后在取多边形任意一个顶点,做这个顶点和多边形所有边带符号三角形之和假设为P,P就为多边形的面积,比较S与P,假如他们相等,点就在多边形内部,假如他们不相等,点不在多边形内部
方法二是:
以点P为端点,向左方做射线L,由于多边形是有界的,所以射线L的左端一定在多边形外,考虑沿着L从无穷远处开始自左向右移动,遇到和多边形的第一个交点的时候,进入到了多边形的内部,遇到第二个交点的时候,离开了多边形。。。所以很容易看出当L和多边形的交点数目C是奇数的时候,P在多边形内,是偶数的话P在多边形外
单有些特殊情况需要考虑,当L和多边形顶点相交的时候,两个顶点只能算为一个交点,当L和多边形的一条边平行的时候,这条边应该忽略不计,
为了统一起见,我们在计算射线L和多边形的交点的时候:1)对于多边形的水平边不作考虑2)对于多边形的顶点和L相交的情况,如果该顶点是其所属的边上纵坐标较大的顶点,则计数,否则忽略3)对于P在多边形边上的情形,直接课判断P属于多边形。由此得出算法的伪代码如下
Count<-0;
以P为端点,作从右向左的射线L;
For 多边形的每条边s
Do if P 在边s上
Then returntrue;
If s 不是水平的
Then if s 的一个端点在L上
If 该端点是s 两端点中纵坐标较大的端点
Then count <-count + 1
Else if s 和L 相交
Then count <-count +1
If count mod 2 =1
Then returntrue;
Else returnfalse;
其中,做射线L的方法是:设P`的纵坐标和P相同,横坐标为正无穷大(很大的一个数),则P和P`就确定了射线L
判断点是否在多边形中的这个算法的时间复杂度为O(n)