JavaScript创建二维路径点网格时如何单循环跳过指定孔洞区域
实现方案
根本不需要拆分四个矩形写重复循环,直接遍历整个完整网格,在循环内加判断跳过孔洞区域的点就行,维护成本比拆区域低得多。
核心逻辑
遍历全量网格点时,只要当前坐标同时满足「X落在孔洞X区间」「Z落在孔洞Z区间」两个条件,就直接跳过当前点,不执行文件生成逻辑,其余点正常处理即可。
核心判断逻辑仅需一行组合条件:
// 命中孔洞则跳过 if (currentX >= wallxWest && currentX <= wallxEast && currentZ >= wallzNorth && currentZ <= wallzSouth) continue;
完整实现代码
你原来定义的边界常量完全不需要改动,只需要把四个拆分的重复循环替换成下面的全范围循环即可:
const fs = require('fs'); const xWest = -7113; const xEast = -6744; const zNorth = -10265; const zSouth = -9896; const wallxWest = -6993; const wallxEast = -6864; const wallzNorth = -10145; const wallzSouth = -10016; for (let currentX = xWest; currentX <= xEast; currentX += 9) { for (let currentZ = zNorth; currentZ <= zSouth; currentZ += 9) { // 孔洞区域判定,命中直接跳过 if ( currentX >= wallxWest && currentX <= wallxEast && currentZ >= wallzNorth && currentZ <= wallzSouth ) continue; // 正常生成对应路径点文件 const filePath = `...${currentX - xWest}_${currentZ - zNorth}.json`; fs.writeFile(filePath, `file_contents_here`, function (err) { if (err) return console.log(err); }); } }
方案优势
- 无冗余代码:所有生成逻辑只实现一次,不需要复制粘贴多份结构相似的循环
- 扩展性极强:后续如果要新增孔洞、调整孔洞大小/位置,只需要修改判断条件即可,不需要重构循环结构;哪怕孔洞变成圆形、多边形等非规则形状,只需要把孔洞判断抽成独立函数实现自定义判定规则,外层循环完全不需要改动
- 可读性高:后续维护时可以直接看到完整的网格边界、孔洞边界,不需要对着四个拆分的矩形反推整体布局
可选优化建议
- 你当前用的回调版
fs.writeFile是全异步无并发控制的,400×400网格扣掉孔洞也有近15万个写入任务,很容易触发系统文件句柄上限导致报错,建议换成带并发控制的写入队列,或者分批写入 - 如果后续要给路径点加属性、做特殊标记,可以先生成所有有效点的坐标数组,再统一做后续处理,把坐标计算和IO操作逻辑拆分,代码结构会更清晰
内容的提问来源于stack exchange,提问作者Uthael
相关产品推荐
相关产品推荐

