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

寻找正交多边形边缘相邻的最近网格点(求高性能方案)

高性能解决方案思路

一、网格数据预处理:放弃遍历,用公式直接计算

由于网格是水平垂直规整排列的,无需存储完整的vector<pair<int,int>>中心点集合,只需记录网格的起始坐标(x0,y0)和步长(dx, dy)。任意坐标对应的网格中心可通过整数运算直接推导:

  • 对于目标坐标X,其左侧紧邻网格x坐标为 x0 + ((X - x0) / dx) * dx
  • 右侧紧邻为 左侧x + dx
  • 上下方向同理,用Y坐标计算对应网格y值
    这种方式将网格点查找从O(N)降到O(1),完全规避遍历大集合的性能损耗。

二、分类型处理正交边缘

正交多边形的边缘仅分水平边(y固定,x区间[x1,x2])和垂直边(x固定,y区间[y1,y2])两类,针对性处理:

  • 水平边:
    • 左/右紧邻网格:按上述公式计算x方向的左右网格点,再结合固定y值得到完整坐标
    • 上/下紧邻网格:计算y方向的上下网格点,结合x区间的任意x(比如中点)得到坐标
  • 垂直边:
    • 上/下紧邻网格:计算y方向的上下网格点,结合固定x值得到完整坐标
    • 左/右紧邻网格:计算x方向的左右网格点,结合y区间的任意y得到坐标

三、红色遮挡多边形的高效判断

提前将遮挡多边形构建为四叉树或网格哈希索引:

  1. 把遮挡多边形的覆盖区域划分成网格块,将被遮挡的网格点标记存入哈希表
  2. 对每个候选紧邻网格点,直接查询哈希表判断是否被遮挡,若被遮挡则依次查找下一个最近的网格点(比如左侧被挡就找再左一个)
    索引构建只需一次预处理,后续判断时间复杂度为O(1),完全适配批量处理需求。

四、批量与并行优化

  • 分组批量处理:将12万条边缘按水平/垂直分组,同组边缘复用相同的计算逻辑,减少分支判断开销
  • 多线程并行:利用OpenMP或语言原生多线程库,将边缘列表拆分为多个子批次并行处理。由于单条边缘的处理完全独立,无数据竞争,可线性提升处理速度

五、代码层面细节优化

  • 全程使用整数运算:若坐标和网格步长均为整数,避免浮点数转换,消除精度误差同时提升运算速度
  • 缓存相邻边缘结果:对于多边形连续的边缘,前一条边的右/上紧邻点,若未被遮挡可直接作为下一条边的左/下紧邻点,无需重复计算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:13:19