Java 二维阵列的索引旋转90度

Java 二维阵列的索引旋转90度,java,algorithm,Java,Algorithm,我知道如何将整个2d数组围绕中心旋转90度(我的2d数组长度总是奇数),但我需要找到一种算法来旋转已知长度的2d数组的特定索引。例如,我知道2d数组是一个17乘17的网格,我希望该方法将索引[4][5]围绕中心旋转90度,并将新索引作为两个独立的整数(y,x)返回;请给我指出正确的方向,或者如果你觉得慈善,我会非常感激一些代码——最好是java。谢谢 假设笛卡尔坐标(即,x指向右侧,y指向上方),并且坐标的形式为array[y][x]17x17网格的中心[cx,cy]为[8,8] 计算点[px,

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

假设笛卡尔坐标(即,
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 ]。i、 e.第一行映射到最后一列,第二行映射到最后一列,以此类推

如果
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

笛卡尔空间
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
开始计数的人必须稍微调整公式。

如果你知道如何旋转整个数组,你需要知道如何旋转单个点。我错过了什么吗?@PeterLawrey是的,你错过了。旋转整个(正方形)数组可以通过对整行或整列的简单操作来完成。@Alnitak要做到这一点,你必须逐点移动每个点。@PeterLawrey某种程度上-从概念上讲,旋转整个数组可能更简单。我正在努力。@PeterLawrey好的,我已经解决了。整个基于数组的解决方案比基于普通几何变换的解决方案更自然,但它们(当然)会退化为相同的公式。只有在使用笛卡尔坐标并围绕原点旋转的情况下。这不是OP要求的吗?尝试将
a[1][0]
旋转到
a[0][1]
;)逆时针旋转90度三次:1,0->0,1->-1,0->0,-1,或顺时针旋转一次:1,0->0,-1。我想我完全没有抓住问题的重点?哦。。。你仍然需要索引是有效的,对吗?不仅仅是笛卡尔空间中的点的位置?我只是针对这篇文章键入了另一个问题,但最后一次编辑回答了它:)。我会在几分钟内实施并给你反馈/接受答案。非常感谢您的投入!