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

合并数组中所有重叠及相邻Rect2矩形:代码未完全生效求助

矩形合并代码问题修复

你的代码之所以会出现部分矩形未合并的情况,主要有两个核心问题:

问题分析

  1. 合并逻辑的遍历缺陷:原代码每次仅取出第一个盒子与其他盒子合并,合并后的新盒子仅放回数组末尾,没有针对这个新盒子再次检查数组中剩余的其他盒子——比如合并后的盒子可能和数组中更早的盒子存在重叠/相邻,但此时已经错过检查时机,甚至在某些复杂场景下直接遗漏。
  2. 相邻判断可能存在漏洞:如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:50:42