我知道如何将整个二维数组围绕中心旋转 90 度(我的二维数组长度总是奇数),但我需要找到一种算法来旋转已知长度的二维数组的特定索引。例如,我知道 2d 数组是一个 17 x 17 的网格,我希望该方法将索引 [4][5] 围绕中心旋转 90 度,并将新索引作为两个单独的 ints(y,x) 返回;请指出我正确的方向,或者如果你觉得我很慈善,我会非常感谢一些代码——最好是在 java 中。谢谢!
3 回答
假设笛卡尔坐标(即x
指向右侧,y
指向上方)并且您的坐标格式array[y][x]
为 17x17 网格的中心 [cx, cy] 为 [8, 8]。
从那里计算点 [px, py] 的偏移量 [dx, dy] 为 [4, 5],即 [-4, -3]
对于顺时针旋转,新位置将是 [cx - dy, cy + dx]
如果您的数组使用指向“向下”的 Y 轴,那么您将需要反转公式中的一些符号。
对于非几何解决方案,请考虑元素 [0][16] 需要映射到 [16][16],并且 [0][0] 需要映射到 [0][16]。即第一行映射到最后一列,第二行映射到倒数第二列,等等。
如果n
比网格的大小(即 16)小一,这意味着该点将[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
</p>
笛卡尔空间中x,y
逆时针旋转 90 度的点映射到-y,x
。
具有 N 列和 M 行的数组将映射到由 M 列和 N 行组成的数组。新的“x”索引将是非正数,并通过添加 M 使其从零开始:
a[x][y]
映射到a[M-y][x]
如果您有一个方形数组,N
每行/列中都有元素,则 90 度逆时针/逆时针旋转发送(x,y)
到(N+1-y,x)
不是吗?
也就是说,如果像我一样,您认为方形数组中左上角的元素是(1,1)
,并且行号向下增加,列号向右增加。我猜想计算的人0
将不得不稍微调整公式。