【问题标题】:2D matrix decomposition with negative scale负尺度二维矩阵分解
【发布时间】:2019-06-20 10:53:20
【问题描述】:

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

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 )

但是,这显然只适用于正比例值,我不确定如何计算正确的负比例。我尝试了使用谷歌找到的各种建议,但到目前为止没有一个能正常工作。

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

我尝试采用对角矩阵.a * matrix.d 的符号,这似乎适用于 x 轴上的比例,但不确定这是否是正确的方法并且无法弄清楚如何处理 y 轴.

这甚至可能吗?我是否必须接受我不会取回确切的组件,而我能期望的最好的结果是产生相同转换的值?

任何帮助或指点将不胜感激。

原创

翻译 = 204, 159

旋转 = -3.0168146900000044

比例 = -3, -2

矩阵 = [ 2.976675975304773, 0.37336327891663146, -0.24890885261108764, 1.984450650203182, 204, 159]

分解

翻译 = 204, 159

旋转 = 0.1247779635897889

比例 = 3, 2

矩阵 = [ 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 )

【问题讨论】:

  • 您能提供一些示例输入和输出吗?
  • 我添加了一个示例输入和输出来演示这个问题
  • 您的代码没有问题 - 这两个矩阵相同(在数值误差范围内)。 -3, -2 的缩放相当于3, 2 的缩放+PI 的旋转,正好等于原始角度和分解角度之差。如果您真的想要“看起来正确”的结果,如果两个比例因子都是正数,您可以翻转它们的符号并将PI 添加到旋转角度。
  • 是的,我知道它们是相同的,我希望能够分解回确切的原始组件,而不是产生相同转换的组件。我认为这是不可能的?

标签: matrix 2d scale decomposition


【解决方案1】:

有时您无法从旋转中分辨出翻转(负比例),例如水平和垂直翻转的图像与旋转 180 度的图像相同。

所以你要做的是知道变换矩阵是否包含翻转。有了这些知识,您可以先取消翻转,照常分解,然后将翻转放回分解后的比例因子中。

伪代码:

Matrix m
hFlip = true
vFlip = true

if hFlip: m = compose(m, scale(-1, 1))
if vFlip: m = compose(m, scale(1, -1))

translation, rotation, scale = decompose(m)

if hFlip: scale.x = -scale.x
if vFlip: scale.y = -scale.y

【讨论】:

    猜你喜欢
    • 2017-12-22
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2014-09-04
    相关资源
    最近更新 更多