Проверьте, выровнена ли матрица по оси - PullRequest
0 голосов
/ 18 июня 2019

Как проверить, выровнена ли матрица по оси?Поэтому я имею в виду любое вращение, кратное 90 градусам (включая 0).

Сейчас самое лучшее, что я придумал, это создание 2 точек, которые выровнены по оси, пропустите их через матрицу и посмотрите, все ли точки по-прежнемувыровнена по оси.


// 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 голосов
/ 18 июня 2019

Если вам нужна подпрограмма, которая будет работать в любом количестве измерений, вы можете сделать два шага.

  1. Убедитесь, что каждая строка (или столбец) содержит все нули, кроме одного числа, которое либо 1, либо -1. Если вы хотите разрешить масштабирование в ваших «поворотах», это число может быть любым ненулевым значением.
  2. Убедитесь, что определитель матрицы равен 1. Если вы хотите разрешить отражения в ваших «поворотах», вы также разрешите разрешить определитель -1. Если вы хотите разрешить масштабирование в своих «вращениях», вы разрешите любой ненулевой определитель.

Как сказано в комментарии, ваша работа будет проще, если вы знаете, что ваша матрица имеет только два измерения.

0 голосов
/ 18 июня 2019

Если у вас есть компоненты аффинной матрицы, которые могут состоять из сдвига, масштаба и поворота, вы можете извлечь угол поворота как

 fi = atan2(-m12, m11)

, где m11 и m12 - первые, авторые компоненты первой строки матрицы (обратите внимание, что матрицы могут быть левосторонними и правосторонними, поэтому вам, возможно, потребуется использовать столбец, а не строку)

Добавление: Что-то похожее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...