射线法判断点是否在多边形内(转)

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



  /**
   * @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'
  }


相关文章

KCPTUN参数解释(转)

为什么要使用KCP?高RTT的网络,TCP的三次握手、慢启动是非常影响体验的机制。150ms RTT,使用BBR拥塞控制且网络0丢包的情况下,慢启动到100Mbps至少需要2s,500Mbps至少5s...

Docker PHP安装扩展步骤详解(转)

前言此篇,主要是演示docker-php-source , docker-php-ext-install ,docker-php-enable-docker-configure 这四个命令到底是用来干...

linux测试硬盘速度(转)

在Linux下,一条简单的名利'dd'就可以帮我们到达这个目的。以下内容是关于如何使用‘dd’命令来测试USB硬盘的读写速度。1. 测试写速度:$ sudo mou...

两点之间距离 PHP、JS版(美团技术博客算法)

/**  * 计算两点之间距离 有少许可以忽略的误差  * 两点不能差距太远  * 适用于 附近商家 &...

地理空间距离计算优化_附近商家(转自美团技术博客)

1 地理空间距离计算面临的挑战打开美团app,不管是筛选团购还是筛选商家,默认的排序项都是“离我最近”或者“智能排序”(如下图所示)。手机app示意不管是“离我最近”还是“智能排序”,都涉及到计算用户...

nginx+php大文件上传参数配置(转)

大文件上传要注意几个环节1,上传文件需要花费较长上传时间和处理执行时间,需要设置nginx上传时间、延攻php执行超时时间2,大文件处理需要占用较大内存,需要增加php内存池,考虑到有多个文件上传处理...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。