【发布时间】:2010-10-27 22:57:43
【问题描述】:
我有一个 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)得到角度
【讨论】:
假设变换 ONLY 包含旋转,这很简单:只需取 m11 元素的 acos。
如果变换包含平移,它仍然可以工作,但如果它包含剪切或缩放,那么你就不走运了。这些可以通过将矩阵分解为剪切、缩放和旋转矩阵来重建,但您得到的结果很可能不是您想要的。
【讨论】:
Transformation Matrix 是一种用于 3d 图形的实现。它简化了数学,以加快点/对象的 3d 位置/旋转方向。从 Transformation 中提取方向确实非常困难,因为它会累积连续的平移/旋转/缩放。
这里有一个建议。取一个指向简单方向(如 (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 所解释的那样,它会因某些值而崩溃。
【讨论】: