Java 基于矩阵的二维点旋转

Java 基于矩阵的二维点旋转,java,math,matrix,rotation,Java,Math,Matrix,Rotation,我有一个6x6矩阵,关键点是G,空点是连字符。(O和L与此问题无关。请注意,侧面和顶部的数字以及左上角的连字符仅用于标记轴。) 通过使用以下两种方法,我能够将上述矩阵向左旋转90度 public static void transpose(int[][] m) { for (int x = 0; x < m.length; x++) { for (int y = x; y < m[0].length; y++) { int temp =

我有一个6x6矩阵,关键点是G,空点是连字符。(O和L与此问题无关。请注意,侧面和顶部的数字以及左上角的连字符仅用于标记轴。)

通过使用以下两种方法,我能够将上述矩阵向左旋转90度

public static void transpose(int[][] m) {
    for (int x = 0; x < m.length; x++) {
        for (int y = x; y < m[0].length; y++) {
            int temp = m[x][y];
            m[x][y] = m[y][x];
            m[y][x] = temp;
        }
    }
}

public static void swapRows(int[][] m) {
    for (int i = 0, k = m.length - 1; i < k; ++i, --k) {
        int[] x = m[i];
        m[i] = m[k];
        m[k] = x;
    }
}
在代码中,我还有一个java.awt.Point的ArrayList,用于存储G点的位置。旋转矩阵后,必须更新这些点。我可以扫描数组中的G点,尽管每个点必须在ArrayList中保持相同的索引,而且无论以何种方式扫描,都不能保证原始矩阵中第一个点的索引将与90度或180度矩阵中的第一个点保持在相同的索引中

对于ArrayList of

public ArrayList<java.awt.Point> keyPoints = new ArrayList<>();
keyPoints.add(new Point(0, 4));
keyPoints.add(new Point(4, 0));
虽然对于90°,我要寻找的输出是

Point: (0.00, 1.00)
Point: (4.00, 5.00)

关于我的for循环的实现,您有什么建议吗(如果没有更好的解决方案的话)?

您已经使用了关于坐标原点(0,0)的旋转方程

如果你想绕任意中心(cx,cy)(我想在你的例子中是矩阵的中间)旋转,那么方程是:

 x' = cx + (x-cx) * Cos(theta) - (y-cy) * Sin(theta)
 y' = cy + (x-cx) * Sin(theta) + (y-cy) * Cos(theta)
编辑:
还有另一种变换矩阵的方法:
给定:将某些坐标(x,y)映射到新坐标(x',y')的函数F
求逆函数
G=inverse(F)
对于给定的目的地(x',y')求源坐标(x,y) 矩阵坐标i,j的行走
提取
元素[i,j]

查找
i',j'=G(i,j)

元素[i',j']
复制到i,j坐标
对i'j'重复,直到返回i,j(4或2个循环)
将提取的
元素[i,j]
复制到最终位置

示例:关于垂直轴的镜像

G(x,y) = (n-1-x, y)
extract R=A[0,0]
G(0,0) = n-1,0
copy A[n-1,0] to A[0,0] 
G(n-1,0) = 0,0        //start coordinate reached
copy R to A[n-1, 0]
do the same for all x<n/2
G(x,y)=(n-1-x,y)
摘录R=A[0,0]
G(0,0)=n-1,0
将[n-1,0]复制到[0,0]
G(n-1,0)=0,0//到达起始坐标
将R复制到A[n-1,0]

对所有x执行相同的操作,您已经使用了关于坐标原点(0,0)的旋转方程

如果你想绕任意中心(cx,cy)(我想在你的例子中是矩阵的中间)旋转,那么方程是:

 x' = cx + (x-cx) * Cos(theta) - (y-cy) * Sin(theta)
 y' = cy + (x-cx) * Sin(theta) + (y-cy) * Cos(theta)
编辑:
还有另一种变换矩阵的方法:
给定:将某些坐标(x,y)映射到新坐标(x',y')的函数F
求逆函数
G=inverse(F)
对于给定的目的地(x',y')求源坐标(x,y) 矩阵坐标i,j的行走
提取
元素[i,j]

查找
i',j'=G(i,j)

元素[i',j']
复制到i,j坐标
对i'j'重复,直到返回i,j(4或2个循环)
将提取的
元素[i,j]
复制到最终位置

示例:关于垂直轴的镜像

G(x,y) = (n-1-x, y)
extract R=A[0,0]
G(0,0) = n-1,0
copy A[n-1,0] to A[0,0] 
G(n-1,0) = 0,0        //start coordinate reached
copy R to A[n-1, 0]
do the same for all x<n/2
G(x,y)=(n-1-x,y)
摘录R=A[0,0]
G(0,0)=n-1,0
将[n-1,0]复制到[0,0]
G(n-1,0)=0,0//到达起始坐标
将R复制到A[n-1,0]

对所有要按90*n以外的角度旋转的xDo执行相同操作?所有旋转均为90*n。由于我的矩阵设置,我不相信90*n以外的旋转是可能的。因此,您最好使用-1/0/1设置一些表格,而不是使用正反计算。@MBo这只会影响计算速度,还是有其他用途?速度和清晰度(我希望)-您可以在代码中看到类似Table90的内容。看我的答案。这种方法可以在适当的位置工作,并且可以使用G90等功能。如果您希望以90*n以外的角度旋转,则所有旋转都是90*n。由于我的矩阵设置,我不相信90*n以外的旋转是可能的。因此,您最好使用-1/0/1设置一些表格,而不是使用正反计算。@MBo这只会影响计算速度,还是有其他用途?速度和清晰度(我希望)-您可以在代码中看到类似Table90的内容。看我的答案。这种方法可以在适当的地方工作,并且可以使用G90等功能
 x' = cx + (x-cx) * Cos(theta) - (y-cy) * Sin(theta)
 y' = cy + (x-cx) * Sin(theta) + (y-cy) * Cos(theta)
G(x,y) = (n-1-x, y)
extract R=A[0,0]
G(0,0) = n-1,0
copy A[n-1,0] to A[0,0] 
G(n-1,0) = 0,0        //start coordinate reached
copy R to A[n-1, 0]
do the same for all x<n/2