首页 > 解决方案 > 3D 复杂矩阵迭代和数据操作

问题描述

我已经达到了预期的结果,但我正在尝试找到一个更优雅的解决方案。现在,它有点硬编码,这不是一个好习惯。

注意:这是一种类似于 PASCAL 的旧机器人语言。

问题:我有一个 STRUCTS 的 3D 矩阵。4 X 4 X 9,但我只关注前 4 X 4。STRUCT 有我需要操作的数据成员。

GlobalTub[i, j, k].calcPos ----这个成员是一个6 REALS (XYZWPR)的仓位类型

通过矩阵初始化是没有问题的。只是一个简单的嵌套 FOR 循环。

--Matrix Size
--numOfTubs = (X_CNT * Y_CNT * Z_CNT)
fCnt = 0        
--Init Matrix
FOR i = 1 TO X_CNT DO       
    FOR j = 1 TO Y_CNT DO
        FOR k = 1 TO Z_CNT DO
            InitPos(GlobalTub[i, j, k].foundPos, 0, 0, 1, 0, 1, 1)
            InitPos(GlobalTub[i, j, k].nextPos, 0, 0, 1, 0, 1, 1)
            InitPos(GlobalTub[i, j, k].calcPos, 0, 0, 1, 0, 1, 1)                       
            GlobalTub[i, j, k].inPlace = FALSE              
            --Assing Tub Number Colmun Major
            fCnt = fCnt + 1
            GlobalTub[i, j, k].tubNum = fCnt
        ENDFOR
    ENDFOR      
ENDFOR

现在我必须对这个 STRUCTS 矩阵进行“托盘化”。现在我只是使用硬编码流程在 X 中迭代 4 个 STRUCTS,在 Y 中移动,然后继续下一个 4。

    --Used for Testing
--1 to 4
FOR i = 1 to 4 DO
    TubPos[i] = tempXYZ
    tempXYZ.X = tempXYZ.X + (xPitch + xTolerance)
ENDFOR

tempXYZ = TubPos[1]
tempXYZ.Y = tempXYZ.Y + (yPitch + yTolerance)

-- 5 to 8
FOR i = 1 to 4 DO
    TubPos[i + 4] = tempXYZ
    tempXYZ.X = tempXYZ.X + (xPitch + xTolerance)
ENDFOR

如何使用嵌套的 FOR 循环来实现这一目标?零件托盘

标签: matrixpascal

解决方案


我回答了我自己的问题....刚刚敲定了。

--Init Loop Counter 
fCnt = 1
FOR j = 1 TO Y_CNT DO
    --Place 4 positions in X 
    FOR i = 1 to X_CNT DO
        TubPos[fCnt] = tempXYZ
        tempXYZ.X = tempXYZ.X + (xPitch + xTolerance)
        fCnt = fCnt + 1
    ENDFOR
    --Shift Y position for next 4 Rows
    tempXYZ = TubPos[fCnt-1]
    tempXYZ.X = tempXYZ.X - ((xPitch + xTolerance) * (X_CNT - 1))
    tempXYZ.Y = tempXYZ.Y + (yPitch + yTolerance)
ENDFOR

这是我的输出 位置


推荐阅读