9

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

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

设置它很容易,将其重新取出很难。

4

5 回答 5

9

最简单的通用方法是将(0,0)和(1,0)变换,然后用三角函数(arctan)得到角度

于 2009-05-21T14:54:25.750 回答
9

假设变换包含一个旋转,这很简单:只需取 m11 元素的 acos 即可。

如果变换包含平移,它仍然有效,但如果它包含剪切或缩放,那么你就不走运了。这些可以通过将矩阵分解为剪切、缩放和旋转矩阵来重建,但你得到的结果很可能不是你想要的。

于 2009-05-21T14:54:36.933 回答
4

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

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

这有帮助吗?

于 2009-05-21T14:56:08.787 回答
2

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

于 2009-05-21T15:30:20.887 回答
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 所解释的,它会因某些值而崩溃。

于 2017-03-17T13:15:51.840 回答