java 判断点是否在园内,判断点是否在多边形内

本文介绍了判断点是否位于简单多边形内部的两种方法:射线法(奇偶法)和转角法。射线法通过计算从点出发穿过边界的次数来判断,转角法则根据点到多边形顶点连线的夹角和。这两种方法都有特定的穿越规则和判断标准,适用于计算机图形学中的多边形内部判断问题。
摘要由CSDN通过智能技术生成

射线法(奇偶法)

只适用于简单多边形(没有自相交点)。从P点开始的射线穿过多边形边界次数,多边形的边界将多边形分为内部和外部。如果是偶数在多边形外部,否则奇数在多边形内部。如下图所示Pin为内部点,Qout为外部点,n为通过边界次数。

9d76959f168b116616a86a7944884b7b.png

另如果射线经过顶点的时候,一个标准的预定是在左边界或下边界的点认定多边形内部,在右边界或上边界的点认为在多边形外部。例如两个不同多边形共享一个公共边,那么在这条边上点会在一个多边形内部而在另一个多边形外部。这样可以避免了在计算机图形显示中会出现的一些问题。

穿越规则测试规则:

1. 方向向上的边包括其开始点,不包括其终止点。

2.方向向下的边不包括其开始点,包括其终止点。

3.水平边不参与穿越测试(前提是选择水平的、向点P右边延伸的射线)。

4.射线和多边形的边焦点必须严格在P点右侧(规定了多边形右边边界上的点在多边形外部,在左边边界上的点在多边形内部)。

转角法

转角法非常简单:按照多边形顶点逆时针顺序,从P点到顶点Vi分别做连线,其中αi为Vi和Vi+1之间的夹角。如果α角度逆时针为正,顺时针为负,这样所有到顶点做连线之间夹角和为(环绕数)0,这点P在多边形外部,否则在内部。

57e5a91efcff7c1a5b8532b21e4aec13.png

如上图所示P点到各个顶点连线夹角和为0,即P在多边形外部。

cf9f36cf95da4259cbb480acac02f86b.png

如上图所示,角度之和 > 0 为在多边形内部。

环绕数推导公式 wn = 1/2π(α0 + α1 + ...... + αi) i ∈[0, n-1] 推导 wn = 1/2π(PVi*PVi+1/|PVi||PVi+1|) i ∈ [0, n-1]。该公式arccos比较耗时。

另两种判断方法:

1. 从P点向右做射线R,如果边从射线R下方跨到上方,那么穿越+1,如果从上方跨到下方,则是-1。最终和为wn环绕数。如下图所示:

d1af5538d0e8f9fcaa6c202ebc79d7f4.png

2. 这种方法不必去计算射线和边的交点,但需要判断点P是否在边的左边,但对于方向向上和向下的边的判断与是否在左边规则不同。对于方向向上的边,如果穿过设想到达P的右边,那么P是在边的左侧;方向向下的边如果穿越射线的正方向,那么P在边的右边(意思是说判断点P与边的关系,而不是相对坐标系内位置)。

ebc1e2045a0ace6082fb10525a674403.png

如上图a 和图b中P点都是位于射线左侧,但是向上和向下方向的边P点位于不同位置。

伪代码如下:需要注意的是同样需要准守射线法中1、2、4项规则。

a996b2ff151c0d5adff1554d1775fbb8.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值