如何从QTransform中提取旋转角度?

时间:2009-05-21 14:46:47

标签: c++ qt math transform

我有一个QTransform对象,想知道对象旋转的角度,但是没有明确的示例如何执行此操作:

http://doc.trolltech.com/4.4/qtransform.html#basic-matrix-operations

设置它很容易,再次将其取回很难。

5 个答案:

答案 0 :(得分:8)

最简单的一般方法是变换(0,0)和(1,0),然后使用三角函数(arctan)来获得角度

答案 1 :(得分:8)

假设转换 ONLY 包含旋转很容易:只需取m11元素的acos。

如果转换包含翻译,它仍然有效,但如果它包含剪切或缩放,则表示运气不佳。这些可以通过将矩阵分解为剪切,缩放和旋转矩阵来重建,但是您得到的结果不太可能是您正在寻找的。

答案 2 :(得分:4)

转换矩阵是用于3d图形的实现。它简化了数学运算,以加快点/物体的三维位置/旋转方向。由于它累积连续平移/旋转/比例的方式,确实很难从转换中取出方向。

这是一个建议。取一个指向简单方向的向量,如(1,0,0),然后将Transform应用于它。你的结果矢量将被翻译和旋转,给你这样的东西:(27.8,19.2,77.4)。将Transform应用于(0,0,0),得到类似于(26.1,19.4,50.8)的东西。您可以使用这两个点来计算基于知道它们的起点(1,0,0)而应用的旋转。

这有帮助吗?

答案 3 :(得分:2)

通常你需要一个反向触发功能,但你需要注意象限模糊,这就是你应该使用atan2(有时拼写为arctan2)。因此,要么将单位矢量[0,1]旋转到[x,y],然后使用atan2(y,x),或者如果矩阵仅实现旋转,则可以使用atan2(m12,m11)。 (这些与Javier和Nils的答案类似,但他们不使用atan2。)

答案 4 :(得分:1)

我正在使用QGraphicsItem只使用setRotate并且没有任何问题,直到我添加旋转组功能。问题是,当调用destroyItemGroup时,它将旋转作为转换应用于项目,而不是旋转。因此我必须从这个QTransform对象恢复旋转。

我的修复方法是将以下行添加到itemChange方法中(归功于tom10的答案):

QVariant MyGraphicItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
    if(change == ItemTransformChange)
    {
        auto transform = value.value<QTransform>();
        setRotation(rotation() + qRadiansToDegrees(qAtan2(transform.m12(), transform.m11())));
        return QVariant();
    }
    ...
}

PS:使用acos和m11()的其他解决方案不起作用。它崩溃了某些值,如tom10所述。