【问题标题】:How do I extract the angle of rotation from a QTransform?如何从 QTransform 中提取旋转角度?
【发布时间】:2010-10-27 22:57:43
【问题描述】:

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

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

设置很容易,重新设置很难。

【问题讨论】:

    标签: c++ qt math transform


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • +1 表示技术准确性。非平移部分的 SVD 分解也浮现在脑海中(旋转组合、沿 x-y 轴的各向异性缩放和旋转))
      【解决方案3】:

      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)。

      这有帮助吗?

      【讨论】:

      • QTransform 使用 3x3 矩阵执行 2D 变换。 4x4 矩阵的 3D 变换非常相似,但 2D 情况下的数学运算要简单一些。话虽这么说,除了 Nils 之外的每个人似乎都忘记了像 [[1,1,0],[0,1,0],[0,0,1]] 这样的剪切变换,在这种情况下,仅仅推动两个点不会返回一个足够描述性的结果。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我在使用 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 所解释的那样,它会因某些值而崩溃。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-15
          • 2022-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多