如何在JavaScript中获取两个Vector3间的所有整数位置列表?
解决Vector3包围空间内整数坐标立方体的获取问题
你的代码核心问题是默认p2坐标始终大于p1,且循环逻辑完全依赖p2的正坐标值,完全没处理坐标为负或者p2某轴坐标小于p1的情况(比如示例里的z轴,p2.z=1 < p1.z=3)。
正确实现思路
要覆盖所有正负坐标、任意p1/p2位置的情况,核心是先确定包围盒的真实范围:
- 对x/y/z三个轴分别计算最小值和最大值(不管p1和p2谁大谁小)
- 遍历每个轴上从最小整数到最大整数的所有值,组合成坐标点
修正后的代码
// 示例输入 const p1 = new Vector3(-1, -1, 3); const p2 = new Vector3(3, 3, 1); const result = []; // 计算包围盒各轴的最小/最大值 const minX = Math.min(p1.x, p2.x); const maxX = Math.max(p1.x, p2.x); const minY = Math.min(p1.y, p2.y); const maxY = Math.max(p1.y, p2.y); const minZ = Math.min(p1.z, p2.z); const maxZ = Math.max(p1.z, p2.z); // 遍历所有整数坐标点 for (let x = Math.floor(minX); x <= Math.floor(maxX); x++) { for (let y = Math.floor(minY); y <= Math.floor(maxY); y++) { for (let z = Math.floor(minZ); z <= Math.floor(maxZ); z++) { result.push(new Vector3(x, y, z)); } } }
代码说明
- 确定包围范围:用
Math.min和Math.max拿到每个轴的真实边界,彻底摆脱p1/p2的位置限制 - 整数遍历:用
Math.floor确保取到边界内的整数(如果输入坐标是小数,比如p1.x=-1.2,若你需要仅包含在包围盒内的整数点,可以改成Math.ceil(minX)到Math.floor(maxX),根据实际需求调整) - 循环逻辑:直接遍历每个轴的整数范围,确保不会遗漏或多生成无关坐标点
针对你的示例
修正后的代码会生成x从-1到3、y从-1到3、z从1到3的所有整数坐标,总共75个点,完全覆盖两个点包围的空间。
内容的提问来源于stack exchange,提问作者iHouqLF
相关产品推荐
相关产品推荐

