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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 09:27:04