如何高效实现网格中矩形扩展区域与原矩形的单元格差异化赋值
问题描述

我拥有如上图所示的网格(注:描述中“一维”应为笔误,实际为二维网格)。其中绿色矩形为网格中的对象,蓝色矩形为该对象的效果覆盖范围。绿色矩形可具备任意尺寸(宽度和高度),蓝色矩形会在所有方向上将绿色矩形扩展X个单元格,但如果绿色矩形处于网格角落,则对应方向不进行扩展。我希望获取蓝色区域内的单元格,并为其赋予与绿色区域单元格不同的值,请问如何高效实现这一需求?
高效实现方案
核心思路是通过坐标范围计算直接定位目标区域,避免遍历整个网格,大幅提升效率:
定义基础坐标参数
假设网格整体范围是(0, 0)到(grid_width-1, grid_height-1),绿色矩形左上角坐标为(g_x1, g_y1),右下角坐标为(g_x2, g_y2)(包含边界),扩展量为X。计算蓝色区域的边界
通过边界限制确保扩展后的区域不超出网格范围:
- 左边界:
b_x1 = max(0, g_x1 - X) - 右边界:
b_x2 = min(grid_width - 1, g_x2 + X) - 上边界:
b_y1 = max(0, g_y1 - X) - 下边界:
b_y2 = min(grid_height - 1, g_y2 + X)
- 分区域赋值
蓝色区域是蓝色边界框减去绿色矩形的范围,通过两次赋值实现:
- 第一步:给蓝色边界框内所有单元格赋予蓝色区域的值
- 第二步:给绿色矩形内的单元格重新赋予绿色区域的值(覆盖第一步的蓝色值)
- 代码示例(伪代码)
# 网格基础参数 grid_width = 10 grid_height = 10 grid = [[0 for _ in range(grid_width)] for _ in range(grid_height)] green_value = 1 blue_value = 2 X = 2 # 绿色矩形坐标(左上角、右下角) g_x1, g_y1 = 2, 2 g_x2, g_y2 = 4, 4 # 计算蓝色区域边界 b_x1 = max(0, g_x1 - X) b_x2 = min(grid_width - 1, g_x2 + X) b_y1 = max(0, g_y1 - X) b_y2 = min(grid_height - 1, g_y2 + X) # 填充蓝色区域 for y in range(b_y1, b_y2 + 1): for x in range(b_x1, b_x2 + 1): grid[y][x] = blue_value # 填充绿色区域(覆盖重叠部分) for y in range(g_y1, g_y2 + 1): for x in range(g_x1, g_x2 + 1): grid[y][x] = green_value
- 大规模网格优化
如果网格规模极大,可使用向量化工库(如NumPy)替代嵌套循环,进一步提升效率:
import numpy as np grid = np.zeros((grid_height, grid_width), dtype=int) # 填充蓝色区域 grid[b_y1:b_y2+1, b_x1:b_x2+1] = blue_value # 填充绿色区域 grid[g_y1:g_y2+1, g_x1:g_x2+1] = green_value
内容的提问来源于stack exchange,提问作者nico.user
相关产品推荐
相关产品推荐

