Clear
Local gaArray[ 5, 5 ]
Dimension gaArray[5, 5]
? "原始数组 = 5x5 矩阵 : " && Original Matrix
=Matrix_Fill(@gaArray)
=Matrix_Show(@gaArray)
? "数组顺(逆)时针旋转 45 度(菱形矩阵) : " && 45 degrees CW/CCW
Local R1[ 1 ] && 任意大于 0 的数
=Matrix_Rotation_45(@gaArray, @R1, .F.) && 第三个参数表示旋转方向:.T.(缺省值) = 顺时针旋转45度(CW),
=Matrix_Show(@R1)
Function Matrix_Fill(A1)
* 数组赋值(自然数) - Fill array with element numbers
Local nRow, nCol
For nRow = 1 To Alen( A1, 1 )
For nCol = 1 To Alen( A1, 2 )
A1[ nRow, nCol ] = Chr(64 + (nRow-1) * Alen( A1, 2 ) + nCol) && 字母 : A-Z
* A1[ nRow, nCol ] = (nRow-1) * Alen( A1, 2 ) + nCol && 数字 : 1-N
Endfor
Endfor
Return
Endfunc
Function Matrix_Show(A1)
* 数组显示 - Display array data
Local nRow, nCol, nRowX, nColY
nRowX = Alen(A1, 1)
nColY = Alen(A1, 2)
For nRow = 1 To nRowX
?
For nCol = 1 To nColY
?? A1[ nRow, nCol ], " "
Endfor
Endfor
Return
Endfunc
Function Matrix_Rotation_45(A1, R1, CW)
* 数组顺(逆)时针旋转 45 度(菱形矩阵)
* 算法 : R(x + y - 1, nSizeA - x + y) = A(x, y)
* 条件 : 必须 x=y,即长度=宽度的正方形矩阵
Local nRow, nCol
CW = Iif(Parameters() < 3, .T., CW) && .T. = 顺时针,.F. = 逆时针
nSizeA = Alen(A1, 1) && 原始矩阵长(宽)度
nSizeR = 2*Alen(A1, 1) && 转换后的矩阵长(宽)度
Dimension R1(nSizeR, nSizeR)
For nRow = 1 To nSizeR
For nCol = 1 To nSizeR
R1(nRow, nCol) = " "
Endfor
Endfor
For nRow = 1 To nSizeR
For nCol = 1 To nSizeR
If nRow <= nSizeA And nCol <= nSizeA
If CW && 顺时针
R1(nRow + nCol - 1, nSizeA - nRow + nCol) = A1(nRow, nCol)
Else && 逆时针,坐标对应对换
R1(nSizeA - nRow + nCol, nRow + nCol - 1) = A1(nCol, nRow)
Endif
Endif
Endfor
Endfor
Endfunc
*!* =======================================
*!* 原始 5x5 数组:
*!* A B C D E
*!* F G H I J
*!* K L M N O
*!* P Q R S T
*!* U V W X Y
*!* CCW 45 度后的菱形数组:
*!* E
*!* D J
*!* C I O
*!* B H N T
*!* A G M S Y
*!* F L R X
*!* K Q W
*!* P V
*!* U
*!* =======================================