我有一个 QTransform 对象,想知道对象旋转的角度,但是没有明确的示例说明如何执行此操作:
http://doc.trolltech.com/4.4/qtransform.html#basic-matrix-operations
设置它很容易,将其重新取出很难。
我有一个 QTransform 对象,想知道对象旋转的角度,但是没有明确的示例说明如何执行此操作:
http://doc.trolltech.com/4.4/qtransform.html#basic-matrix-operations
设置它很容易,将其重新取出很难。
最简单的通用方法是将(0,0)和(1,0)变换,然后用三角函数(arctan)得到角度
假设变换只包含一个旋转,这很简单:只需取 m11 元素的 acos 即可。
如果变换包含平移,它仍然有效,但如果它包含剪切或缩放,那么你就不走运了。这些可以通过将矩阵分解为剪切、缩放和旋转矩阵来重建,但你得到的结果很可能不是你想要的。
转换矩阵是用于 3d 图形的实现。它简化了数学,以加快点/对象的 3d 位置/旋转方向。由于它累积连续平移/旋转/比例的方式,确实很难从转换中提取方向。
这是一个建议。取一个指向简单方向(如 (1,0,0))的向量,然后对其应用变换。你得到的向量将被平移和旋转,得到类似这样的东西:(27.8, 19.2, 77.4)。将变换应用于 (0,0,0),得到类似 (26.1, 19.4, 50.8) 的结果。您可以使用这两个点来计算基于知道它们的起点 (1,0,0) 已应用的旋转。
这有帮助吗?
通常你需要一个反三角函数,但你需要注意象限模糊,这就是你应该使用的 atan2(有时拼写为 arctan2)。因此,要么将单位向量 [0, 1] 旋转到 [x, y],然后使用 atan2(y,x),或者如果矩阵仅实现旋转,则可以使用 atan2(m12,m11)。(这些类似于 Javier 和 Nils 的答案,但它们不使用 atan2。)
我使用 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 所解释的,它会因某些值而崩溃。