如何实现网格检查函数在坐标越界时跳过检查?
解决网格边界索引越界问题
你的代码在检查目标网格(grid_i, grid_j)周边3x3区域时,会因为i或j超出网格的有效索引范围(比如grid_i=0时i=-1,或者grid_i是最后一行时i等于总行数)导致索引越界错误。可以通过限制循环的有效范围或者循环内添加索引合法性判断来解决,下面是两种可行方案:
方案1:直接缩小循环范围(更高效)
先计算出i和j的有效边界,避免遍历无效的索引:
b_overlap = False # 获取网格的总行数和总列数 num_rows = len(v_circle) num_cols = len(v_circle[0]) if num_rows > 0 else 0 # 计算i的有效范围:不小于0,不超过总行数-1 start_i = max(0, grid_i - 1) end_i = min(num_rows - 1, grid_i + 1) # 计算j的有效范围:不小于0,不超过总列数-1 start_j = max(0, grid_j - 1) end_j = min(num_cols - 1, grid_j + 1) for i in range(start_i, end_i + 1): for j in range(start_j, end_j + 1): print(f"i, j = {i}, {j}") if len(v_circle[i][j]) > 0: for c_iteration in v_circle[i][j]: if distance(c_candidate, c_iteration) < c_iteration.radius_ + c_candidate.radius_: b_overlap = True # 一旦发现重叠,直接跳出所有循环优化性能 break else: continue break if not b_overlap: v_circle[grid_i][grid_j].append(c_candidate) print(f"Ball was added at ({x}, {y})")
关键说明:
max(0, grid_i-1)确保起始索引不会小于0,避免顶部/左侧越界min(num_rows-1, grid_i+1)确保结束索引不会超过最后一行的索引,避免底部/右侧越界- 额外添加了多层循环的提前跳出逻辑,一旦检测到重叠就终止遍历,提升效率
方案2:循环内添加索引合法性判断
如果不想修改循环范围,也可以在每次访问v_circle[i][j]前先检查索引是否合法:
b_overlap = False num_rows = len(v_circle) num_cols = len(v_circle[0]) if num_rows > 0 else 0 # 修正range范围:原代码漏掉了grid_i+1,需要用grid_i+2才能覆盖i-1、i、i+1 for i in range(grid_i-1, grid_i+2): for j in range(grid_j-1, grid_j+2): # 跳过索引无效的情况 if i < 0 or i >= num_rows or j < 0 or j >= num_cols: continue print(f"i, j = {i}, {j}") if len(v_circle[i][j]) > 0: for c_iteration in v_circle[i][j]: if distance(c_candidate, c_iteration) < c_iteration.radius_ + c_candidate.radius_: b_overlap = True break else: continue break if not b_overlap: v_circle[grid_i][grid_j].append(c_candidate) print(f"Ball was added at ({x}, {y})")
注意点:
- 原代码中
range(grid_i-1, grid_i+1)只会生成grid_i-1和grid_i两个值,漏掉了grid_i+1,正确的范围应该是range(grid_i-1, grid_i+2)才能覆盖i-1, i, i+1三个值,同理j的范围也需要修正。
内容的提问来源于stack exchange,提问作者Georgia Nissen
相关产品推荐
相关产品推荐

