Java Swing寻路项目为Node添加theta角度维度出现数组越界问题求解
问题根因
你触发数组越界的核心原因是Java数组的下标规则使用错误:
- 三维数组初始化时第三维长度设为
(int) theta,Java数组下标从0开始计数,长度为N的数组合法下标范围为0 ~ N-1 - 赋值时你直接用
(int) theta作为第三维下标,刚好等于数组长度,必然越界。比如你输入theta为2时,数组长度为2,合法下标只有0和1,用2访问就会抛出你遇到的报错。
同时你的设计逻辑存在问题:角度是连续值,不能直接用用户输入的theta作为数组长度,需要先做离散化处理。
修正方案
步骤1:确定角度离散化规则
先固定角度的最小步长,比如常用15°、30°作为一个档位,步长越小精度越高,但内存占用和计算量也越大。示例用15°为步长:
// 全局定义角度离散化参数,可按需调整 final int ANGLE_STEP = 15; // 单档位角度差 final int ANGLE_TOTAL = 360 / ANGLE_STEP; // 总档位数量,15°步长对应24个档位
步骤2:修正三维数组初始化与赋值逻辑
// 数组第三维长度固定为总角度档位数量 map = new Node[cellsWidth][cellsHeight][ANGLE_TOTAL]; for (int x = 0; x < cellsWidth; x++) { for (int y = 0; y < cellsHeight; y++) { // 遍历所有角度档位完成全量初始化 for (int thetaIdx = 0; thetaIdx < ANGLE_TOTAL; thetaIdx++) { double currentTheta = thetaIdx * ANGLE_STEP; map[x][y][thetaIdx] = new Node(2, x, y, currentTheta); } } }
步骤3:用户输入theta值时转换为下标
后续用户标记起点/终点输入theta后,先转换为对应档位下标再访问数组:
// 先对输入角度做归一化,再转成下标 int thetaIdx = (int)(((userInputTheta % 360) + 360) % 360 / ANGLE_STEP); Node targetNode = map[x][y][thetaIdx];
额外注意
- 原有A*、Dijkstra算法需要同步修改,邻居节点扩展除了坐标移动的情况,还要补充原地旋转的动作(对应theta档位变化),同时调整旋转动作对应的代价计算逻辑
- 若内存占用过高,可以调大
ANGLE_STEP的值降低档位数量
内容的提问来源于stack exchange,提问作者moawwad
相关产品推荐
相关产品推荐

