负尺度的二维矩阵分解

时间:2019-01-27 04:14:05

标签: matrix 2d scale decomposition

我有一个根据位置,比例和旋转(无偏斜)创建的二维矩阵。我希望能够将此矩阵分解回原始组件,并设法通过以下伪代码做到这一点:

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找到的各种建议,但到目前为止没有一个能正常工作。

我尝试了here的可接受答案,并解释了here的分解,尽管它们产生了正确的变换,但比例和旋转分量与我的原始值不匹配。

我尝试过取对角矩阵的符号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 )

0 个答案:

没有答案