我有一个QTransform对象,想知道对象旋转的角度,但是没有明确的示例如何执行此操作:
http://doc.trolltech.com/4.4/qtransform.html#basic-matrix-operations
设置它很容易,再次将其取回很难。
答案 0 :(得分:8)
最简单的一般方法是变换(0,0)和(1,0),然后使用三角函数(arctan)来获得角度
答案 1 :(得分:8)
假设转换 ONLY 包含旋转很容易:只需取m11元素的acos。
如果转换包含翻译,它仍然有效,但如果它包含剪切或缩放,则表示运气不佳。这些可以通过将矩阵分解为剪切,缩放和旋转矩阵来重建,但是您得到的结果不太可能是您正在寻找的。 p>
答案 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所述。