2d阵列的指数旋转90度

时间:2012-08-21 18:54:29

标签: java algorithm

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

具有N列和M行的数组将映射到M列和N行的数组。新的“x”索引将是非正数,并且将通过添加M:

从零开始

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

答案 2 :(得分:0)

如果你的每个行/列都有一个带有N元素的正方形数组,那么90度反转/逆时针转发(x,y)(N+1-y,x)不是吗?

也就是说,如果像我一样,你认为方形数组中的左上角元素是(1,1),行数增加,列数增加到右边。我想从0开始计算的人必须稍微调整一下公式。