经典算法 | 计算几何 | 判断点是否在多边形内部两个算法

判断点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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值