概观
考虑一个样本矩阵可能如下所示:
ABCD
EFGH
IJKL
MNOP
为了我的解释,ABCD被认为是行0,EFGH是第1行,依此类推。行0的第一个像素是A.
另外,当我谈到外壳时,我指的是:
ABCD
E H
I L
MNOP
首先我们来看看移动值的代码。
int top = matrix[first][i]; // save top
第一行将值缓存在顶部位置。这是指由[first] [i]确定的矩阵的顶行上的位置。例如:保存A.
// left -> top
matrix[first][i] = matrix[last-offset][first];
下一部分将值从左侧位置移动到顶部位置。例如:把M放在A的位置。
// bottom -> left
matrix[last-offset][first] = matrix[last][last - offset];
下一部分将值从底部位置移动到左侧位置。例如:拿P并把它放在M的地方。
// right -> bottom
matrix[last][last - offset] = matrix[i][last];
下一个部分将值从正确位置移动到底部位置。例如:拿D并把它放在P所在的位置。
// top -> right
matrix[i][last] = top; // right
最后一部分将缓存中的值(顶部位置)移动到正确的位置。例如:把A从D的第一步。
接下来的循环。
外部循环从行0到总行数的一半。这是因为当您旋转第0行时,它也会旋转最后一行,当您旋转第1行时,它也会旋转第二行到最后一行,依此类推。
内循环从行中的第一个像素位置(或列)运行到最后一个。请记住,对于行0,这是从像素0到最后一个像素,但对于行1,这是从像素1到第二个到最后一个像素,因为第一个和最后一个像素作为行0的一部分旋转。
所以外圈的第一次迭代使得外壳旋转。换一种说法:
ABCD
EFGH
IJKL
MNOP
变为:
MIEA
NFGB
OJKC
PLHD
看看外壳是如何顺时针旋转的,但内芯没有移动。
然后外循环的第二次迭代导致第二行旋转(不包括第一个和最后一个像素),我们最终得到:
MIEA
NJFB
OKGC
PLHD