我知道如何围绕中心将整个2D数组旋转90度(我的2D数组长度始终为奇数),但我需要找到一种算法来旋转已知长度的2D数组的特定索引。例如,我知道这个2D数组是一个17x17的网格,我想要这个方法将索引[4][5]围绕中心旋转90度,并将新的索引作为两个独立的整数(y,x)返回。请指点我方向,或者如果您感到慷慨,我非常感谢一些代码片段 - 最好用Java编写。谢谢!
x
指向右,y
指向上),并且您的坐标以 array[y][x]
的形式给出,17x17 网格中心点 [cx, cy] 为 [8, 8]。
计算您的点 [px, py] 偏移量 [dx, dy],即 [-4, -3]。
按顺时针旋转后的新位置将是 [cx - dy, cy + dx]。
如果您的数组使用 Y 轴指向“下方”,则需要在公式中反转一些符号。
对于非几何解决方案,考虑将元素 [0][16] 映射到 [16][16],[0][0] 映射到 [0][16]。 即第一行映射到最后一列,第二行映射到倒数第二列,依此类推。
如果 n
是网格大小(即 16)减去 1,那么点 [y][x]
将映射到 [x][n - y]
。
从理论上讲,几何解决方案应该提供相同的答案 - 这里是等价的:
n = 17 - 1;
c = n / 2;
dx = x - c;
dy = y - c;
nx = c - dy = c - (y - c) = 2 * c - y = n - y
ny = c + dx = c + (x - c) = x
笛卡尔空间中的点 x,y
逆时针旋转90度映射到 -y,x
。
具有N列和M行的数组将映射到具有M列和N行的数组。新的“x”索引将为非正数,并通过添加M使其从零开始:
a[x][y]
映射到 a[M-y][x]
a[1][0]
旋转到 a[0][-1]
;) - Peter Lawrey如果你有一个每行/列包含 N
个元素的正方形数组,逆时针旋转90度会将 (x,y)
转换为 (N+1-y,x)
,不是吗?
也就是说,如果像我一样,认为正方形数组中左上角的元素是 (1,1)
,行号向下增加,列号向右增加。我想从 0
开始计数的人需要适当调整公式。