Как получить угол от матрицы

Я получил такую ​​матрицу вращения:

1.0 0.0 0.0 2.07814 0.0 -0.809017 0.587785 0.0 0.0 -0.587785 -0.809017 0.0 0.0 0.0 0.0 1.0 

Как я могу получить угол от этого? Если я применяю инверсию, я получаю это

 cos exp -1 (-0.809017) = 144.0 sin exp -1 (-0.587785) = -36.0 sin exp -1 ( 0.587785) = 36.0 cos exp -1 (-0.809017) = 144.0 

Но моя проблема в том, что я знаю, что угол был 216,0 gradleусов, Как мне вернуть этот угол?

Я думаю, вы вычисляете обратные функции неверно таким образом, который поразил меня как причудливый. Вы должны использовать asin для обратного sin и acos для обратного cos. Вы вычисляете мультипликативный обратный, а не функциональный обратный. Хотя здесь, похоже, это одно и то же.

Используйте функцию atan2() . Он даст угол от значений y и x. Он неявно вычисляет обратный sin и инверсный cos и проверяет знаки как y, так и x, чтобы обнаружить правильный квадрант.

  ATAN2 (3)

 НАЗВАНИЕ
        1.8 `atan2 ',` atan2f' - дуальная касательная к y / x

 СИНТАКСИС
             #include 
             double atan2 (двойной Y, двойной X);
             float atan2f (float Y, float X);

 ОПИСАНИЕ
        `atan2 'вычисляет обратную касательную (касательную к дуге) Y / X.  `Atan2' 
        дает правильный результат даже для углов вблизи pi / 2 или -pi / 2 (что
        когда X близко к 0).

           `atan2f 'идентичен` atan2', за исключением того, что он принимает и возвращает `float '.

 ВОЗВРАТ
        `atan2 'и` atan2f' возвращают значение в радианах в диапазоне от -pi до pi.

Я предполагаю, что мы игнорируем то, что 2.07814 явно не является частью вращения. atan2(0.587785, -0.809017) дает мне 144,0 gradleуса. atan(-0.587785, -0.809017) дает 216,0.


Ага! Ваша matrix «боком» от того, к чему я привык. Я думаю, что часть 2.07814 – это просто перевод. Используя эту трехмерную матрицу вращения в качестве ориентира,

 1 0 0 0 cos sin 0 -sin cos 

… оставляет меня таким же смущенным, как раньше. Я продолжаю получать 144,0.


Исповедь.

Я замаскировал выше радианы / gradleусы, потому что я использовал Postscript вместо C.

 $ gsnd -q GS>0.587785 -0.809017 atan = 144.0 GS>-0.587785 -0.809017 atan = 216.0 GS> 

Чтобы получить угол поворота (theta) из матрицы вращения 3×3 (R), вы можете использовать следующую формулу:

tr (R) = 1 + 2 * cos (тета),

где tr – след .

В вашем примере rotation задается:

 1.00000 0.00000 0.00000 0.00000 -0.80902 0.58779 0.00000 -0.58779 -0.80902 

Следовательно, след

 1 - 0.80902 - 0.80902 = -0.61804` 

и угол равен acos ((- 0,61804 – 1) / 2) * (180 / pi) = 144 °

Таким образом, matrix представляет rotation против часовой стрелки на 144 °. Альтернативно, как 144 = -216 mod 360, он представляет rotation по часовой стрелке на 216 °.