理解Qt的QTransform旋转函数

6
作为对这个问题的回答,我想更深入地了解Qt的QTransform::rotate函数。在文档中,它说:

QTransform & QTransform::rotate ( qreal angle, Qt::Axis axis = Qt::ZAxis )

围绕指定的坐标轴逆时针旋转给定角度,并返回矩阵的引用。

请注意,如果将QTransform应用于以部件坐标定义的点,则旋转方向将是顺时针,因为y轴指向下。

角度以度数指定。

从我之前的问题中,我了解到要以顺时针方向旋转QPolygonF,实际上必须按逆时针方向旋转90度,这是根据rotate函数。
QPolygonF original = QPolygonF() << QPoint(0, 1) << QPoint(4, 1) << QPoint(4, 2) << QPoint(0, 2);
QTransform transform = QTransform().translate(2, 2).rotate(90).translate(-2, -2);
QPolygonF rotated = transform.map(original);
qDebug() << rotated;

输出:

QPolygonF(QPointF(3, 0) QPointF(3, 4) QPointF(2, 4) QPointF(2, 0) ) 

例如,对于这个矩形: original rectangle rotation 旋转到这里: new rectangle rotation 为什么会这样呢?为什么文档中说我的调用QTransform::rotate实际上会导致顺时针旋转,而我认为我不在“widget坐标系”中——这里没有涉及任何小部件。
2个回答

8

QTransform 在数学笛卡尔坐标系中操作。例如,右上象限是正 X 轴和正 Y 轴的象限 1。而您的图表在反转了 Y 轴的部件坐标系中,其中象限1位于右下角。

旋转确实是逆时针旋转的。但由于小部件坐标系中的 Y 轴已经翻转,因此它变成了顺时针旋转。

如您所提到的,多边形与部件无关。它确实是逆时针旋转的,但您正在使用部件坐标系来可视化它。


谢谢Stephen,这解释得很清楚。 - Mitch

3

实际上,我认为问题在于所讨论的函数旋转的是坐标系而非对象。如果你想顺时针旋转你的对象,那么等同于逆时针旋转坐标系。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接