寻找正交多边形边缘相邻的最近网格点(求高性能方案)
高性能解决方案思路
一、网格数据预处理:放弃遍历,用公式直接计算
由于网格是水平垂直规整排列的,无需存储完整的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得到坐标
三、红色遮挡多边形的高效判断
提前将遮挡多边形构建为四叉树或网格哈希索引:
- 把遮挡多边形的覆盖区域划分成网格块,将被遮挡的网格点标记存入哈希表
- 对每个候选紧邻网格点,直接查询哈希表判断是否被遮挡,若被遮挡则依次查找下一个最近的网格点(比如左侧被挡就找再左一个)
索引构建只需一次预处理,后续判断时间复杂度为O(1),完全适配批量处理需求。
四、批量与并行优化
- 分组批量处理:将12万条边缘按水平/垂直分组,同组边缘复用相同的计算逻辑,减少分支判断开销
- 多线程并行:利用OpenMP或语言原生多线程库,将边缘列表拆分为多个子批次并行处理。由于单条边缘的处理完全独立,无数据竞争,可线性提升处理速度
五、代码层面细节优化
- 全程使用整数运算:若坐标和网格步长均为整数,避免浮点数转换,消除精度误差同时提升运算速度
- 缓存相邻边缘结果:对于多边形连续的边缘,前一条边的右/上紧邻点,若未被遮挡可直接作为下一条边的左/下紧邻点,无需重复计算
内容的提问来源于stack exchange,提问作者kil47
相关产品推荐
相关产品推荐

