У меня есть двумерная матрица, созданная из положения, масштаба и поворота (без перекоса). Я хотел бы иметь возможность разложить эту матрицу обратно на исходные компоненты, и мне удалось сделать это с помощью следующего псевдокода:
posX = matrix.tx
posY = matrix.ty
scaleX = Sqrt( matrix.a * matrix.a + matrix.b * matrix.b )
scaleY = Sqrt( matrix.c * matrix.c + matrix.d * matrix.d )
rotation = ATan2( -matrix.c / scaleY, matrix.a / scaleX )
Однако это, очевидно, работает только с положительными значениями шкалы, и я не уверен, как рассчитать правильные отрицательные шкалы. Я пробовал разные предложения, найденные с помощью Google, но пока ни один из них не работал правильно.
Я попробовал принятый ответ от здесь и объяснение разложения здесь , хотя они производят правильные преобразования, компоненты масштаба и поворота не соответствуют моим исходным значениям.
Я попытался взять знак диагонали matrix.a * matrix.d, который, кажется, работает для масштаба по оси x, но не уверен, что это правильный подход и не может понять, как обращаться с осью y .
Это вообще возможно? Должен ли я согласиться с тем, что я не верну точные компоненты, и лучшее, на что я могу надеяться, это значения, которые производят одно и то же преобразование?
Любая помощь или указатели будут с благодарностью.
Оригинал
Перевод = 204, 159
Вращение = -3.0168146900000044
Масштаб = -3, -2
Matrix = [2.976675975304773, 0,37336327891663146, -0,24890885261108764, 1,984450650203182, 204, 159]
Разложение
Перевод = 204, 159
Вращение = 0,1247779635897889
Масштаб = 3, 2
Matrix = [2.976675975304773, 0,3733632789166315, -0,24890885261108767, 1,984450650203182, 204, 159]
При этом использовался следующий код декомпозиции:
posX = matrix.tx
posY = matrix.ty
scaleX = Sgn( a ) * Sqrt( matrix.a * matrix.a + matrix.b * matrix.b )
scaleY = Sgn( d ) * Sqrt( matrix.c * matrix.c + matrix.d * matrix.d )
rotation = ATan2( -matrix.c / scaleY, matrix.a / scaleX )