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

数组第n个元素移至n+1位置后矩形位置异常,求解决

问题分析与修正方案

你的数组操作如果是将old_index元素移到new_index,首先要确认数组操作逻辑是否正确:当前你用insert(new_index, test_array[old_index])再remove_at(old_index+1)的方式,仅当new_index > old_index时会导致错误(会删除原old_index+1的元素而非原old_index元素)。正确的数组移动逻辑应该是先删除再插入:

var element = test_array[old_index]
test_array.remove_at(old_index)
test_array.insert(new_index, element)

同时,visualization数组也需要同步做相同的元素移动,才能保证矩形和数组元素一一对应:

var moved_rect = visualization[old_index]
visualization.remove_at(old_index)
visualization.insert(new_index, moved_rect)

接下来是矩形位置的修正,你的位置偏移逻辑存在循环方向和目标值错误,以下是两种修正方式:

方式1:直接同步到索引对应位置(无动画)

如果不需要过渡动画,直接让每个索引的矩形回到对应位置是最稳妥的,避免逻辑错误:

func insert_rect(new_index:int, old_index:int):
    # 同步更新数组和可视化数组
    var element = test_array[old_index]
    test_array.remove_at(old_index)
    test_array.insert(new_index, element)
    
    var moved_rect = visualization[old_index]
    visualization.remove_at(old_index)
    visualization.insert(new_index, moved_rect)
    
    print("putting " + str(old_index) + "th number in " + str(new_index) + "th index")
    
    # 定义基础位置和间距(根据你的场景调整数值)
    var base_x:float = 100.0
    var rect_spacing:float = 50.0
    
    # 逐个设置矩形到对应索引的位置
    for i in range(visualization.size()):
        visualization[i].position.x = base_x + i * rect_spacing

方式2:过渡动画效果

如果需要逐个移位的动画效果,修正你的位置逻辑:

func insert_rect(new_index:int, old_index:int):
    # 同步更新数组和可视化数组
    var element = test_array[old_index]
    test_array.remove_at(old_index)
    test_array.insert(new_index, element)
    
    var moved_rect = visualization[old_index]
    visualization.remove_at(old_index)
    visualization.insert(new_index, moved_rect)
    
    print("putting " + str(old_index) + "th number in " + str(new_index) + "th index")
    
    # 定义基础位置和间距(根据你的场景调整数值)
    var base_x:float = 100.0
    var rect_spacing:float = 50.0
    # 目标位置:要移动的矩形最终的x坐标
    var target_pos:float = base_x + new_index * rect_spacing

    if new_index < old_index:
        # 元素向前移:从old_index-1倒序到new_index,逐个往后挪位置
        for i in range(old_index - 1, new_index - 1, -1):
            visualization[i].position.x = base_x + (i + 1) * rect_spacing
    elif new_index > old_index:
        # 元素向后移:从old_index+1顺序到new_index,逐个往前挪位置
        for i in range(old_index + 1, new_index + 1):
            visualization[i].position.x = base_x + (i - 1) * rect_spacing
    
    # 最后移动目标矩形到新位置
    moved_rect.position.x = target_pos

错误原因说明

  1. 你之前保存的是visualization[new_index].position.x,但实际上应该保存要移动的矩形的目标位置(或原始位置),而非目标索引原有的矩形位置。
  2. 向前移动时,循环方向错误:应该从后往前遍历,避免覆盖还未处理的位置值;向后移动时,循环范围和方向也需要对应调整,保证每个中间矩形都能正确移位。

内容的提问来源于stack exchange,提问作者Sushiaaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:59:57