QTransform(QMatrix)功能方法(5.12)


//for starf study

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include
#include
#include
#include
#include
#include
#include
#include

//QTransform类指定坐标系的二维变换。
//变换指定如何平移、缩放、剪切、旋转或投影坐标系,通常在渲染图形时使用。
//QMatrix是QT5以前QTransform的前身,相比QTransform功能一致但要更弱
//所以在QT 5的环境下完全可以忽略QMatrix
//即使遇到了旧工程用到了QMatrix 也可以将其当作 QTransform 处理
//QTransform的控制变换由一个3*3矩阵完成,如:
/*
        ************************
        * m11 * m12 * m13 *
        ************************
        * m21 * m22 * m23 *
        ************************
        * m31 * m32 * m33 *
        ************************
*/
//这里有9个参数,用于实现所有的矩阵变换(平移、缩放、透视、旋转坐标系)
//m11	水平缩放
//m22	垂直缩放
//m21	水平扭曲
//m12	垂直扭曲
//m31(dx)	水平位移
//m32(dy)	垂直位移
//m13	水平映射
//m23	垂直映射
//m33	额外的映射因子

//这九个参数能对坐标轴实现任何变换,所以操作这些参数就是在操作坐标轴
//也是在操作参数矩阵,以下提到的矩阵指的就是画出来的这个参数矩阵
//里面可能会涉及很多数学名词和概念
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent *)
{
    QTransform Transform;//QTransform提供一次性设置所有属性的构造函数,不过写起来不易于阅读,一般不用
    //QTransform::QTransform(qreal m11, qreal m12, qreal m21, qreal m22, qreal dx, qreal dy)
    //QTransform::QTransform(const QMatrix &matrix)

    Transform = Transform.rotate(45, Qt::XAxis);//将坐标系绕指定轴逆时针旋转给定角度,并返回对矩阵的引用。
                                                            //如果对小部件坐标中定义的点应用QTransform,旋转方向将是顺时针的,因为y轴指向下方。
    Transform = Transform.scale(1.8,1.2); //按sx水平和sy垂直缩放坐标系,并返回对矩阵的引用。
    //void QTransform::setMatrix(qreal m11, qreal m12, qreal m13, qreal m21, qreal m22, qreal m23, qreal m31, qreal m32, qreal m33)
    //此函数用于一次性设置所有矩阵值,由于其难以阅读,所以不使用此函数

    Transform = Transform.shear(0.5,0.5); //设置水平剪切坐标系sh,垂直剪切sv,并返回对矩阵的引用。(角度透视)
    Transform = Transform.translate(100, 50); //沿x轴移动坐标系dx,沿y轴移动坐标系dy,并返回对矩阵的引用。
    QTransform sqtoqu;
    qDebug()<< Transform.squareToQuad(QPolygonF(QRectF(200,200,80,80)),sqtoqu); //创建变换矩阵trans,将单位正方形映射到四边形quad。
                                                                        //如果构造了转换,则返回true;如果不存在转换,则返回false。
                                                                        //存在转换,将转换矩阵交给参数2


    QTransform scale = Transform.fromScale(1.5,1.5); //创建一个矩阵,该矩阵是原矩阵对应于sx水平和sy垂直的缩放。
    qDebug()<<scale;
    QTransform translate = Transform.fromTranslate(20,20); //创建一个矩阵,该矩阵是原矩阵对应于dx沿x轴和dy沿y轴的平移。
    qDebug()<<translate;
    double ttx;
    double tty;
    Transform.map(10,15,&ttx,&tty);  //map函数,将输入的对象经过本身变换之后,输出变换后的对象
                                                         //参数1,2代表一个点的x,y值,函数会将变换之后的点的X,Y赋值给ttx,tty
    //QPointF QTransform::map(const QPointF &p) const
    //QLine QTransform::map(const QLine &l) const
    //QLineF QTransform::map(const QLineF &line) const
    //QPolygonF QTransform::map(const QPolygonF &polygon) const
    //QPolygon QTransform::map(const QPolygon &polygon) const
    //QRegion QTransform::map(const QRegion ®ion) const
    //QPainterPath QTransform::map(const QPainterPath &path) const
    //void QTransform::map(int x, int y, int *tx, int *ty) const
    //QPoint QTransform::map(const QPoint &point) const  //功能同理,返回变换之后的对象
    QRectF rct = Transform.mapRect(QRectF(15,15,50,50));//创建并返回一个QRectF对象,该对象是给定矩形的副本,映射到该矩阵定义的坐标系中。
                //如果指定了旋转或剪切,此函数将返回边界矩形。要检索给定矩形映射到的确切区域,请改用mapToPolygon()函数。
    //QRect QTransform::mapRect(const QRect &rectangle) const
    QPolygon pol = Transform.mapToPolygon(QRect(15,15,50,50));//创建并返回一个QPolygon对象,该对象是参数所示的矩形映射过的样子。
    QTransform create;
    qDebug()<<Transform.quadToQuad(QPolygon(QRect(15,15,30,30)),QPolygon(QRect(45,20,67,123)),create);
            //尝试创建一个变换矩阵,此变换矩阵能将四边形1映射为四边形2,如果创建成功,返回true
            //创建成功,将创建的变换矩阵存放在参数3中
    QTransform square;
    qDebug()<<Transform.quadToSquare(QPolygon(QRect(15,75,30,30)),square);
        //尝试创建一个变换矩阵,此变换矩阵能将参数1的四边形映射到单位正方形,如果成功,则返回true
        //创建成功,将创建的变换矩阵存放在参数2中


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

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

    qDebug()<<Transform.m11(); //返回m11参数
    qDebug()<<Transform.m12(); //返回m12参数
    qDebug()<<Transform.m21(); //返回m21参数
    qDebug()<<Transform.m22(); //返回m22参数
    qDebug()<<Transform.m31(); //返回m31参数
    qDebug()<<Transform.m32(); //返回m32参数
    QTransform adjoint = Transform.adjoint(); //返回此矩阵的伴随。
    qDebug()<<adjoint;
    qDebug()<<Transform.determinant(); //返回矩阵的行列式。
    qDebug()<<Transform.dx(); //返回水平平移因子。 同 m31
    qDebug()<<Transform.dy(); //返回垂直平移因子。 同 m32
    QTransform invert = Transform.inverted(); //返回此矩阵的反转副本。
                                                                //如果矩阵是奇异的(不可逆的),则返回的矩阵是单位矩阵。
    qDebug()<<invert;
    qDebug()<< Transform.isAffine(); //如果矩阵表示仿射变换,则返回true,否则返回false。
    qDebug()<<Transform.isIdentity();//如果矩阵是单位矩阵,则返回true,否则返回false。
    qDebug()<<Transform.isInvertible();//如果矩阵可逆,则返回true,否则返回false。
    qDebug()<<Transform.isRotating(); //如果矩阵表示某种旋转变换,则返回true,否则返回false。
    qDebug()<<Transform.isScaling(); //如果矩阵表示缩放变换,则返回true,否则返回false。
    qDebug()<<Transform.isTranslating(); //如果矩阵表示转换,则返回true,否则返回false。
    QMatrix mat;
    mat = Transform.toAffine(); //以仿射矩阵的形式返回QTransform。
                                                //如果已指定透视转换,则转换将导致数据丢失。因为 QMatrix 不支持透视
    QTransform trans;
    trans = Transform.transposed(); //返回此矩阵的转置。
    qDebug()<<Transform.type(); //返回此矩阵的转换类型。
                                              //转换类型是捕获矩阵所有转换的最高枚举值。例如,如果矩阵同时缩放和剪切,则类型将为TxShear,因为TxShear的枚举值高于TxScale。
                                                //了解矩阵的转换类型对于优化非常有用:通常可以比处理泛型更优化地处理特定类型。
    /*
QTransform::TxNone            0x00
QTransform::TxTranslate     0x01        平移
QTransform::TxScale           0x02         缩放
QTransform::TxRotate         0x04         旋转
QTransform::TxShear          0x08         透视
QTransform::TxProject        0x10
*/


     Transform.reset(); //将矩阵重置为单位矩阵,即除m11和m22(指定比例)以及m33设置为1外,所有元素均设置为零。
}




QTransform(QMatrix)功能方法(5.12)_第1张图片

你可能感兴趣的:(QT,QT基础控件,qt5,c++,qt)