了解Qt的QTransform旋转功能

时间:2012-04-17 13:56:07

标签: c++ qt rotation coordinates

由于this question,我想更多地了解Qt的QTransform::rotate函数。 In the documentation,它说:

  

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

     

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

     

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

     

角度以度为单位。

根据我之前提出的问题,我了解到要顺时针旋转QPolygonF,我必须根据rotate函数实际逆时针旋转90度:

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

E.g。对于这个矩形:

original rectangle rotation

要旋转到此处:

new rectangle rotation

这是为什么?为什么文档说我对QTransform::rotate的调用实际上导致顺时针旋转,当我相信我不在“小部件坐标”时 - 这里没有涉及小部件。

2 个答案:

答案 0 :(得分:7)

QTransform在数学笛卡尔坐标系中运行。即。右上象限是正x和正y象限(象限1)。您的图表位于y轴翻转的Widget坐标中,右下角有象限1。

旋转确实逆时针旋转。但由于Y轴在Widget坐标中翻转,因此它变为顺时针方向。

正如您所提到的,多边形与小部件无关。它确实旋转CCW,但您可以使用小部件坐标将其可视化。

答案 1 :(得分:3)

实际上我认为问题在于有问题的函数会旋转坐标系 - 而不是对象。如果要顺时针旋转对象,则相当于逆时针旋转坐标系。