You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS实现:如何判断经纬度高程坐标点是否在指定立方体区域内

高性能立方体飞行区域点判定实现

核心优化原则

因为判定逻辑每50ms就要执行一次,核心优化思路是把可预计算的逻辑全部前置到配置加载阶段,判定阶段只保留最轻量化的数值比较操作,完全避免判定过程中出现循环、浮点运算、对象遍历等高开销操作。

注意:绝对不要在高频执行的判定函数内重复计算立方体的坐标边界,这部分逻辑仅需在加载飞行区域JSON配置时执行一次即可。


第一步:配置加载阶段预处理立方体数据

原始传入的cube是包含8个顶点坐标的数组,我们在游戏启动/加载飞行区域配置时,一次性遍历所有立方体的顶点,提前计算好每个立方体三个坐标轴的最小、最大值并缓存,后续判定直接读取缓存值。
预处理代码(仅执行1次):

function preprocessFlightZones(rawCubeList) {
  return rawCubeList.map(vertices => {
    // 用第一个顶点初始化三个轴的最值
    let minLat = vertices[0].lat, maxLat = minLat;
    let minLon = vertices[0].lon, maxLon = minLon;
    let minAlt = vertices[0].alt, maxAlt = minAlt;

    // 遍历剩余7个顶点更新最值
    for (let i = 1; i < 8; i++) {
      const p = vertices[i];
      if (p.lat < minLat) minLat = p.lat;
      if (p.lat > maxLat) maxLat = p.lat;
      if (p.lon < minLon) minLon = p.lon;
      if (p.lon > maxLon) maxLon = p.lon;
      if (p.alt < minAlt) minAlt = p.alt;
      if (p.alt > maxAlt) maxAlt = p.alt;
    }

    // 返回缓存好的边界参数
    return { minLat, maxLat, minLon, maxLon, minAlt, maxAlt };
  });
}

第二步:高频判定函数实现

预处理完成后,判定逻辑只需要做6次整数大小比较,无任何额外开销,单线程每秒可执行千万次以上,完全满足50ms一次的性能要求:

function checkIfInBox(playerLat, playerLon, playerAlt, cube) {
  return (
    playerLat >= cube.minLat &&
    playerLat <= cube.maxLat &&
    playerLon >= cube.minLon &&
    playerLon <= cube.maxLon &&
    playerAlt >= cube.minAlt &&
    playerAlt <= cube.maxAlt
  );
}

补充说明

  • 上述方案针对边与经纬度、高程轴平行的轴对齐立方体(AABB) 是100%精确的,性能为所有判定方案里的最高级别。
  • 如果你的飞行区域是带旋转的任意朝向立方体,可以先用上述逻辑做粗筛,快速排除99%以上明显不在范围内的区域,再对剩余极少数候选区域做精确的向量点乘判定,整体性能依然远高于全量精确判定。
  • 若飞行区域数组很长,可以进一步按纬度/经度做网格分块索引,判定时只检索玩家所在网格周边的少量立方体,进一步降低遍历开销。

内容的提问来源于stack exchange,提问作者TotallyRealElonMusk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:48:17