QTransform

一、描述

QTransform是Qt中推荐的转换类。转换指定如何平移,缩放,剪切,旋转或投影坐标系,通常在渲染图形时使用。

QTransform类支持矩阵乘法,加法和减法,并且可以流式传输和比较该类的对象。

1.1、渲染图形

渲染图形时,矩阵定义了转换,但是实际的转换由QPainter执行。默认情况下,QPainter在关联设备自己的坐标系上运行。QPaintDevice的标准坐标系的原点位于左上角。x值向右增加; y值向下增加。

QPainter具有无需使用QTransform即可平移,缩放,剪切和旋转坐标系的功能。 例如:

    QPainter painter(this);
    painter.setPen(QPen(Qt::blue, 1, Qt::DashLine));
    painter.drawRect(0, 0, 100, 100);

    painter.rotate(45);

    painter.setFont(QFont("Helvetica", 24));
    painter.setPen(QPen(Qt::black, 1));
    painter.drawText(20, 10, "QTransform");

尽管这些函数非常方便,但是如果要执行多个转换操作,则构建QTransform并调用QPainter::setTransform()会更加高效。 例如:

     QPainter painter(this);
     painter.setPen(QPen(Qt::blue, 1, Qt::DashLine));
     painter.drawRect(0, 0, 100, 100);

     QTransform transform;
     transform.translate(50, 50);
     transform.rotate(45);
     transform.scale(0.5, 1.0);
     painter.setTransform(transform);

     painter.setFont(QFont("Helvetica", 24));
     painter.setPen(QPen(Qt::black, 1));
     painter.drawText(20, 10, "QTransform");

1.2、基本矩阵操作

一个QTransform对象包含一个3 x 3的矩阵。

  • m31(dx)和m32(dy)指定水平和垂直平移。
  • m11和m22元素指定水平和垂直缩放。
  • m21和m12元素指定水平和垂直剪切。
  • m13和m23元素指定水平和垂直投影,m33作为附加投影因子。

QTransform使用以下公式将平面中的一个点转换为另一个点:

 x' = m11*x + m21*y + dx
 y' = m22*y + m12*x + dy
 if (is not affine) 
{
     w' = m13*x + m23*y + m33
     x' /= w'
     y' /= w'
 }

点(x,y)是原始点,(x',y')是变换后的点。通过对inverted()(倒置)矩阵执行相同的运算,可以将(x',y')转换回(x,y)。

二、成员函数

1、QTransform(qreal m11, qreal m12, qreal m21, qreal m22, qreal dx, qreal dy)

     QTransform(qreal m11, qreal m12, qreal m13, qreal m21, qreal m22, qreal m23, qreal m31, qreal m32, qreal m33 = 1.0)

构造函数。

2、QTransform()

m11、m22、m33设置为1,其他元素设置为零。

3、qreal m11() const ~ qreal QTransform::m33()

获取各矩阵值。

4、QTransform adjoint()

获取矩阵的伴随矩阵。伴随矩阵

5、qreal determinant()

返回矩阵的行列式。行列式

6、[static] QTransform fromScale(qreal sx, qreal sy)

创建一个QTransform,矩阵对应于水平sx和垂直sy的缩放比例。 这与scale(sx,sy)相同,但速度稍快。

7、[static] QTransform fromTranslate(qreal dx, qreal dy)

创建一个QTransform,阵对应于dx沿x轴和平移dy沿y轴平移。 这与translate(dx,dy)相同,但速度稍快。

8、QTransform inverted(bool *invertible = nullptr)

返回此矩阵的转置矩阵。如果矩阵是奇异的(不可逆),则返回的矩阵是恒等矩阵。 如果参数不为空,则如果矩阵是Invertible,则将其值设置为true,否则将其设置为false。

9、bool isAffine()

矩阵是否是仿射变换矩阵。仿射变换

10、bool isIdentity()

矩阵是否是单位矩阵。单位矩阵

11、bool isInvertible()

矩阵是否可逆。

12、bool isRotating()

矩阵是否表示某种旋转变换。180度和/或360度的旋转变换被视为缩放变换。

13、bool isScaling()

矩阵是否表示比例转换。

14、bool isTranslating()

矩阵是否平移矩阵。

15、QPoint map(const QPoint &p) 

       QPointF map(const QPointF &p) 

       QLine map(const QLine &l) 

       QLineF map(const QLineF &l) 

       QPolygonF map(const QPolygonF &a) 

       QPolygon map(const QPolygon &a) 

       QRegion map(const QRegion &r) 

       QPainterPath map(const QPainterPath &p) 

       void map(int x, int y, int *tx, int *ty) 

       void map(qreal x, qreal y, qreal *tx, qreal *ty) 

       QRectF mapRect(const QRectF &rectangle) 

       QRect mapRect(const QRect &rectangle) 

       QPolygon mapToPolygon(const QRect &rectangle) 

把一个图形映射到矩阵坐标。

例,绘制矩形和圆心在(200,200)的圆:

     QPainter painter(this);
     painter.setPen(QPen(Qt::blue, 1, Qt::DashLine));
     painter.drawRect(0, 0, 100, 100);
     painter.setBrush(Qt::red);
     painter.drawEllipse(QPoint(200,200),10,10);

     QTransform transform;
     transform.translate(50, 50);
     transform.scale(0.5, 0.5);

     painter.setTransform(transform);
     painter.setPen(QPen(Qt::cyan, 1, Qt::DashDotLine));
     painter.drawRect(0, 0, 100, 100);
     auto point = transform.map(QPoint(200,200));
     qDebug()<<point;
     painter.drawEllipse(point,10,10);

 

 把点(200,200)做映射后绘制同样的形状:

16、[static] bool quadToQuad(const QPolygonF &one, const QPolygonF &two, QTransform &trans) 

多边形能否one映射到另一个多边形two。

17、[static] bool quadToSquare(const QPolygonF &quad, QTransform &trans)

多边形quad能否在trans中映射为单位正方形。

18、void reset()

将矩阵重置为单位矩阵,即所有元素均设置为零,m11、m22、m33设置为1,其他元素设为0。

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

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

围绕指定的轴逆时针旋转坐标系,并返回对矩阵的引用。如果将QTransform应用于QWidget坐标中定义的点,则旋转方向将为顺时针方向,因为y轴指向下方。

     QPainter painter(this);
     auto rectPoint = event->rect().center();
     QTransform transform;
     transform.translate(rectPoint.x(),rectPoint.y());
     transform.rotate(45);

     painter.setTransform(transform);
     painter.setPen(QPen(Qt::cyan, 3, Qt::DashDotLine));
     painter.drawRect(0, 0, 100, 100);

20、QTransform &scale(qreal sx, qreal sy)

按sx水平和sy垂直缩放坐标系,并返回对矩阵的引用。

     auto rectPoint = event->rect().center();
     QTransform transform;
     transform.translate(rectPoint.x(),rectPoint.y());
     transform.scale(0.5,0.5);

     painter.setTransform(transform);
     painter.setPen(QPen(Qt::cyan, 3, Qt::DashDotLine));
     painter.drawRect(0, 0, 100, 100);

21、void setMatrix(qreal m11, qreal m12, qreal m13, qreal m21, qreal m22, qreal m23, qreal m31, qreal m32, qreal m33)

设置矩阵。

22、QTransform &shear(qreal sh, qreal sv)

水平剪切水平轴,垂直剪切水平轴sv,并返回对矩阵的引用。

     auto rectPoint = event->rect().center();
     QTransform transform;
     transform.translate(rectPoint.x(),rectPoint.y());

     painter.setTransform(transform);
     painter.setPen(QPen(Qt::red, 3, Qt::DashDotLine));
     painter.drawRect(0, 0, 100, 100);

     transform.shear(0.5,0.5);
     painter.setTransform(transform);
     painter.setPen(QPen(Qt::cyan, 3, Qt::DashDotLine));
     painter.drawRect(0, 0, 100, 100);

23、[static] bool squareToQuad(const QPolygonF &quad, QTransform &trans)

变换矩阵trans是否可以将单位正方形映射到多边形quad。

24、QTransform &translate(qreal dx, qreal dy)

沿x轴移动坐标系dx并沿y轴移动dy,并返回对矩阵的引用。

25、QTransform transposed()

返回此矩阵的转置。

  • 13
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值