3

我知道如何将整个二维数组围绕中心旋转 90 度(我的二维数组长度总是奇数),但我需要找到一种算法来旋转已知长度的二维数组的特定索引。例如,我知道 2d 数组是一个 17 x 17 的网格,我希望该方法将索引 [4][5] 围绕中心旋转 90 度,并将新索引作为两个单独的 ints(y,x) 返回;请指出我正确的方向,或者如果你觉得我很慈善,我会非常感谢一些代码——最好是在 java 中。谢谢!

4

3 回答 3

4

假设笛卡尔坐标(即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>

于 2012-08-21T19:00:34.693 回答
1

笛卡尔空间中x,y逆时针旋转 90 度的点映射到-y,x

具有 N 列和 M 行的数组将映射到由 M 列和 N 行组成的数组。新的“x”索引将是非正数,并通过添加 M 使其从零开始:

a[x][y]映射到a[M-y][x]

于 2012-08-21T19:10:20.707 回答
1

如果您有一个方形数组,N每行/列中都有元素,则 90 度逆时针/逆时针旋转发送(x,y)(N+1-y,x)不是吗?

也就是说,如果像我一样,您认为方形数组中左上角的元素是(1,1),并且行号向下增加,列号向右增加。我猜想计算的人0将不得不稍微调整公式。

于 2012-08-21T19:19:50.240 回答