oracle判断奇数偶数_判断一点是否在多边形内部:射线法

042509087093c91f7335603b66e45632.png

PIP问题

在几何学中,PIP(Point in Polygon)问题:即判断一点在多边形的内部或外部的问题。

射线法(Ray casting algorithm)是一种判断点是否在多边形内部的一种简单方法。即从该点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部,否则点在多边形外部。

41870a086215359cd3beebd38941e15b.png

射线法

如何理解呢?

其实,对于平面内任意闭合曲线,曲线都把平面分割成了内、外两部分。对于平面内任意一条直线,在穿越多边形边界时,有且只有两种情况:进入多边形或穿出多边形。即:

  • 如果点在多边形内部,射线第一次穿越边界一定是穿出多边形。
  • 如果点在多边形外部,射线第一次穿越边界一定是进入多边形。

由于直线可以无限延伸,而闭合曲线包围的区域是有限的,因此最后一次穿越多边形边界,一定是穿出多边形,到达外部。

由上可推断,从一点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部;如果交点个数为偶数,则点在多边形外部。

需要注意以下几种特殊情况:

  1. 点在多边形的顶点或边上
  2. 点在多边形边的延长线上
  3. 点的射线与多边形相交于多边形的顶点上
19157fa67f33220c415e716c43bf9455.png

特殊情况1

fbe2c7b4b9b993abd6318d70b4df8e73.png

特殊情况3

9fe40a6158db5a4ae576c3032a641183.png

特殊情况2

针对特殊情况1,只需判断点是否在多边形的边线上即可。

针对特殊情况3,可以通过设定这样的规则:

若点的射线与多边形相交于多边形的顶点上,若该顶点为该边上纵坐标较大的点,则认为穿越一次。

如下图所示,

X点的射线经过D点,但D点纵坐标均大于A和C点,因此,穿越次数为2;

Y点的射线经过C点,但C点纵坐标大于B点,但小于D点,因此,穿越次数为1;

Z点的射线经过B点,但B点纵坐标均小于A和C点,因此,穿越次数为0;

4113a2c45e62990274fc6bfa57dae7a4.png

特殊情况3的处理

针对特殊情况2的处理,在对特殊情况3的处理中已经有所包括,即穿越次数为0。

小提示:在依次判断点的射线与每条边的相交情况之前,可以先对多边形做一下坐标转换,方便计算,即将多边形转换到以判断点为原点的坐标系中。

Matlab代码如下。

主程序

183c152d03e7ec6dbc8feb69b3b78493.png

判断点是否在多边形内部

50de875ab1c69466ebb09052b22334b8.png
869a2b2eb8ae541a2097a63306de8eee.png

判断点是否在线上

607a12fcda843c7a18b5f0850d5493ba.png

计算与x轴的交点横坐标

f0d862bfb6e8ea08f28d2ff34f62559a.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值