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