检查矩阵是否对齐

时间:2019-06-18 08:54:22

标签: math matrix

如何检查矩阵是否对齐? 因此,我的意思是任何旋转90度(包括0)的倍数。

现在,我想出的最好的办法是创建两个轴对齐的点,将它们传递通过矩阵,然后查看这些点是否仍是轴对齐的。


// return 0, 90, 180 or 270 if axis aligned, else returns -1
static public int test_matrix_axis_aligned(Mat3 m) {

    int rot = -1;

    Vec2 a = create_vec2(0, 0);
    Vec2 b = create_vec2(1000, 0);

    a = mult(m, a);
    b = mult(m, b);

    // TODO rounding with a certain threshold?
    a.x = round(a.x);
    a.y = round(a.y);
    b.x = round(b.x);
    b.y = round(b.y);

    boolean axis_aligned = a.x == b.x || a.y == b.y;

    if (axis_aligned) {

        //float angle = atan2(b.y - a.y, b.x - a.x);
        //println("a: "+angle);
        //if (angle < 0) angle += PI; // wrong for 270
        //rot = (int) round(degrees(angle));

        float dx = a.x - b.x;
        float dy = a.y - b.y;

        if (dx < 0 && dy == 0) {
            rot = 0;
        } else if (dx == 0 && dy < 0) {
            rot = 90;
        } else if (dx > 0 && dy == 0) {
            rot = 180;
        } else if (dx == 0 && dy > 0) {
            rot = 270;
        }

    }

    return rot;
}

但是我想知道它是否可以更有效地完成。

2 个答案:

答案 0 :(得分:0)

如果仿射矩阵的成分可能由平移,缩放和旋转组成,则可以将旋转角度提取为

 fi = atan2(-m12, m11)

其中m11m12是第一行和第二行的secons组成部分(请注意,矩阵可能是左撇子和右撇子,因此您可能需要使用列而不是行)

添加:Something similar

答案 1 :(得分:0)

如果您想要一个可以在任意数量的维度上运行的例程,则可以执行两个步骤。

  1. 检查每一行(或每一列)是否包含全零,但一个数字为1-1。如果要允许缩放“旋转”,则此数字可以是任何非零值。
  2. 检查矩阵的行列式为1。如果要在“旋转”中允许反射,则还应允许行列式-1。如果要允许缩放“旋转”,则允许使用任何非零的行列式。

正如评论所言,如果您知道矩阵只有两个维度,那么您的工作就容易得多。