1. 射线法介绍
在地图应用上,我们会经常需要判断一个点是否位于多边形区域内,这里介绍下采用射线法如何实现。
算法思想:从待判断的点向某一个方向引射线,计算和多边形交点的个数,如果个数是偶数或者0,则点在多边形外,如果是奇数,则在多边形内,如下图:
射线法判断点是否在多边形内(可用于地图)
这里有两种情况需要特殊处理:
1) 射线经过顶点:当射线经过顶点时,判断就会出现异常情况。
2) 点在边上:这种情况也不能用交点个数的奇偶性来判断了,要快速地判断这个点是否在边上:
 

2. 代码实现——C语言

/** 
   * @description 射线法判断点是否在多边形内部 
   * @param {Object} p 待判断的点,格式:{ x: X坐标, y: Y坐标 } 
   * @param {Array} poly 多边形顶点,数组成员的格式同 p 
   * @return {String} 点 p 和多边形 poly 的几何关系 
   */  
  function rayCasting(p, poly) {  
    var px = p.x,  
        py = p.y,  
        flag = false  
  
    for(var i = 0, l = poly.length, j = l - 1; i < l; j = i, i++) {  
      var sx = poly[i].x,  
          sy = poly[i].y,  
          tx = poly[j].x,  
          ty = poly[j].y  
  
      // 点与多边形顶点重合  
      if((sx === px && sy === py) || (tx === px && ty === py)) {  
        return 'on'  
      }  
  
      // 判断线段两端点是否在射线两侧  
      if((sy < py && ty >= py) || (sy >= py && ty < py)) {  
        // 线段上与射线 Y 坐标相同的点的 X 坐标  
        var x = sx + (py - sy) * (tx - sx) / (ty - sy)  
  
        // 点在多边形的边上  
        if(x === px) {  
          return 'on'  
        }  
  
        // 射线穿过多边形的边界  
        if(x > px) {  
          flag = !flag  
        }  
      }  
    }  
  
    // 射线穿过多边形边界的次数为奇数时点在多边形内  
    return flag ? 'in' : 'out'  
  }
C实现

相关文章:

  • 2022-12-23
  • 2021-08-22
  • 2021-12-10
  • 2022-02-24
  • 2021-08-15
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-08
相关资源
相似解决方案