合并数组中所有重叠及相邻Rect2矩形:代码未完全生效求助
矩形合并代码问题修复
你的代码之所以会出现部分矩形未合并的情况,主要有两个核心问题:
问题分析
- 合并逻辑的遍历缺陷:原代码每次仅取出第一个盒子与其他盒子合并,合并后的新盒子仅放回数组末尾,没有针对这个新盒子再次检查数组中剩余的其他盒子——比如合并后的盒子可能和数组中更早的盒子存在重叠/相邻,但此时已经错过检查时机,甚至在某些复杂场景下直接遗漏。
- 相邻判断可能存在漏洞:如果
overlap_adjacent函数没有完整覆盖所有相邻场景(比如边缘对齐但垂直/水平方向有交集的情况),会直接导致应该合并的矩形被忽略。
修复后的代码
首先确保overlap_adjacent函数的逻辑正确:
func overlap_adjacent(a: Rect2, b: Rect2) -> bool: # 先检查是否重叠(包括完全包含的情况) if a.overlaps(b): return true # 计算矩形的边界坐标 var a_right = a.position.x + a.size.x var a_bottom = a.position.y + a.size.y var b_right = b.position.x + b.size.x var b_bottom = b.position.y + b.size.y # 右边缘与左边缘相邻,且垂直方向有重叠 if a_right == b.position.x and max(a.position.y, b.position.y) < min(a_bottom, b_bottom): return true # 左边缘与右边缘相邻,且垂直方向有重叠 if b_right == a.position.x and max(a.position.y, b.position.y) < min(a_bottom, b_bottom): return true # 下边缘与上边缘相邻,且水平方向有重叠 if a_bottom == b.position.y and max(a.position.x, b.position.x) < min(a_right, b_right): return true # 上边缘与下边缘相邻,且水平方向有重叠 if b_bottom == a.position.y and max(a.position.x, b.position.x) < min(a_right, b_right): return true return false
然后重写合并逻辑,确保所有可合并的矩形都被处理:
func combine_boxes(boxes: Array) -> void: var i = 0 while i < boxes.size(): var current_box = boxes[i] var has_merged = false # 从数组末尾往前检查,避免移除元素导致索引失效 var j = boxes.size() - 1 while j > i: if overlap_adjacent(current_box, boxes[j]): # 合并当前盒子与目标盒子 current_box = current_box.merge(boxes[j]) # 移除被合并的盒子 boxes.remove(j) has_merged = true j -= 1 if has_merged: # 替换当前盒子为合并后的新盒子 boxes[i] = current_box # 回退索引,重新检查当前盒子是否能和前面的盒子合并 i = max(i - 1, 0) else: # 没有合并,处理下一个盒子 i += 1
逻辑说明
- 逐个处理数组中的每个盒子,对每个盒子,从数组末尾往前检查所有未处理的盒子,一旦发现可合并的就立即合并并移除被合并的盒子。
- 合并完成后回退索引,确保合并后的新盒子能和前面的盒子再次检查合并,避免遗漏链式合并的情况。
- 从后往前遍历的方式,避免移除元素时打乱未遍历的索引顺序。
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

