Processing寻路算法调用golinego函数时程序冻结无响应问题求助
问题根因
你遇到的程序无响应冻结是golinego函数内的while循环触发死循环导致的,具体触发逻辑如下:
- 当用户绘制的遮挡完全阻断从起点(30,30)到终点(470,470)的斜向路径时,你的寻路逻辑会让坐标(i,j)进入往复摆动的状态,永远满足
dist(i,j,470,470) > 10的循环条件,程序会一直卡在while循环中无法执行后续逻辑。 - 具体的死循环触发流程:
- 当探测到
pixelss[i+1][j+1] == 1(右下方是障碍物)时,不会执行右下角移动的逻辑 - 此时如果当前坐标
pixelss[i][j]也被标记为障碍物,会执行i-=1; j-=1退回上一步坐标 - 下一轮循环又会再次尝试往右下角走,再次碰到障碍物又退回,循环往复永远不会到达终点。
- 当探测到
修复方案
- 先增加循环次数兜底限制,避免程序完全卡死:
void golinego() { stroke(200, 200, 255); line(30, 30, 470, 470); int j = 30; int i = 30; // 增加最大循环次数兜底,画布最大对角线长度不到700,2000次足够覆盖所有可能的移动 int maxLoop = 2000; int currentLoop = 0; while (dist(i, j, 470, 470) > 10 && currentLoop < maxLoop) { currentLoop++; stroke(0, 0, 180); circle(i, j, 1); if (pixelss[i+1][j+1]==0) { i++;j++;} if (pixelss[i][j]==1) { if (pixelss[i][j+1]==1) { if (pixelss[i+1][j]==0) { i++;} } else if (pixelss[i+1][j]==1) { if (pixelss[i][j+1]==0) { j++;} } else { i-=1; j-=1; } } } }
- 优化寻路逻辑:当前的试探逻辑不具备绕障能力,只能沿斜向走,遇到连续障碍物就会卡住,你可以替换为BFS、A*等成熟的寻路算法实现绕障功能。
- 补充边界判断:当前
golinego函数中访问pixelss[i+1][j+1]时没有做边界校验,当i或j接近499时会触发数组越界异常,建议和绘制逻辑一样加异常捕获或者边界判断。
内容的提问来源于stack exchange,提问作者Gergő Szabó
相关产品推荐
相关产品推荐

