基于矩阵

时间:2016-04-12 02:15:08

标签: java math matrix rotation

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

// Original Matrix
- 012345
0 ----G-
1 ----L-
2 ----L-
3 ----L-
4 GOOOL-
5 ------

通过使用以下两种方法,我可以将上面的矩阵向左旋转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;
    }
}

交换行,然后转置行,得到以下矩阵。 (以下说明包括180度旋转)

// Rotated -90° Matrix    // Rotated 180° Matrix
- 012345                  - 012345
0 ------                  0 ------
1 GLLLL-                  1 -LOOOG
2 ----O-                  2 -L----
3 ----O-                  3 -O----
4 ----O-                  4 -O----
5 ----G-                  5 -G----

在代码中,我还有一个java.awt.Point的ArrayList,它存储G点的位置。旋转矩阵后,必须更新这些点。我可以扫描数组中的G点,虽然每个点必须在ArrayList中保持相同的索引,并且无论扫描的方式如何,都不能保证原始矩阵中第一个点的索引将保留在与90度或180度矩阵中的第一个点相同的指数。

对于

的ArrayList
public ArrayList<java.awt.Point> keyPoints = new ArrayList<>();
keyPoints.add(new Point(0, 4));
keyPoints.add(new Point(4, 0));

我目前有这种方法来旋转点。
它基于以下等式。

Matrix Rotation Equation

for (int i = 0; i < keyPoint.size(); i++) {
    Point p = keyPoint.get(i);
    double angle = Math.toRadians(-90);
    double cos = Math.cos(angle);
    double sin = Math.sin(angle);
    double x = (p.x * cos) - (p.y * sin);
    double y = (p.x * sin) + (p.y * cos);
    keyPoint.set(i, new Point((int) x, (int) y));
    System.out.printf("Point: (%.2f, %.2f)\n", x, y);
}

对于90度旋转,我目前得到的输出如下

Point: (4.00, 0.00)
Point: (0.00, -4.00)

虽然对于90°,​​我正在寻找的输出是

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

对于for循环的实现,您是否有任何建议,(如果不是更好的解决方案)?

1 个答案:

答案 0 :(得分:0)

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

如果你想围绕任意中心(cx,cy)旋转(我认为你的情况下矩阵的中间),那么方程是:

 x' = cx + (x-cx) * Cos(theta) - (y-cy) * Sin(theta)
 y' = cy + (x-cx) * Sin(theta) + (y-cy) * Cos(theta)

编辑:
还有另一种就地转换矩阵的方法:
给定:函数F将一些坐标(x,y)映射到新坐标(x',y')
找到对于给定目标(x',y')找到源坐标(x,y)的反函数G=Inverse(F) 走遍矩阵坐标i,j
提取Element[i,j]
查找i',j' = G(i,j)
Element[i',j']复制到i,j坐标
重复i'j'直到返回i,j发生(4或2个循环)
将提取的Element[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