2维数组索引的90度旋转

3
我知道如何围绕中心将整个2D数组旋转90度(我的2D数组长度始终为奇数),但我需要找到一种算法来旋转已知长度的2D数组的特定索引。例如,我知道这个2D数组是一个17x17的网格,我想要这个方法将索引[4][5]围绕中心旋转90度,并将新的索引作为两个独立的整数(y,x)返回。请指点我方向,或者如果您感到慷慨,我非常感谢一些代码片段 - 最好用Java编写。谢谢!

2
如果你知道如何旋转整个数组,那么你也需要知道如何旋转单个点。我有遗漏什么吗? - Peter Lawrey
@PeterLawrey 是的,您是。整个(方)数组的旋转可以通过对整行或整列进行简单操作来完成。 - Alnitak
@Alnitak,要做到这一点,您必须逐个移动每个点。 - Peter Lawrey
@PeterLawrey,从概念上讲,整个数组可能更简单。我正在努力工作。 - Alnitak
@PeterLawrey 好的,我解决了。整个基于数组的解决方案比基于正常几何变换的解决方案更自然,但它们(当然)会退化为相同的公式。 - Alnitak
3个回答

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


我刚刚在打另一个问题,涉及到这篇文章,但最后的编辑已经回答了我的问题 :). 我会实现它并在一段时间内给你反馈/接受答案。非常感谢您的帮助! - John

1

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

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

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


只有在使用笛卡尔坐标并围绕原点旋转时才需要这样做。 - Alnitak
那不是原帖所要求的吗? - John
试着将 a[1][0] 旋转到 a[0][-1] ;) - Peter Lawrey
逆时针旋转90度三次:1,0 -> 0,1 -> -1,0 -> 0,-1,或者顺时针旋转一次:1,0 -> 0,-1。我猜我完全没有理解问题的重点? - John
哦...你仍然需要索引是有效的,对吗?不仅仅是笛卡尔空间中点的位置? - John

1

如果你有一个每行/列包含 N 个元素的正方形数组,逆时针旋转90度会将 (x,y) 转换为 (N+1-y,x),不是吗?

也就是说,如果像我一样,认为正方形数组中左上角的元素是 (1,1),行号向下增加,列号向右增加。我想从 0 开始计数的人需要适当调整公式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接