2D матричная декомпозиция с отрицательной шкалой - PullRequest
0 голосов
/ 27 января 2019

У меня есть двумерная матрица, созданная из положения, масштаба и поворота (без перекоса). Я хотел бы иметь возможность разложить эту матрицу обратно на исходные компоненты, и мне удалось сделать это с помощью следующего псевдокода:

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 )
...