QT的QMatrix类的使用

您所在的位置:网站首页 定义矩阵类模板CMatrix QT的QMatrix类的使用

QT的QMatrix类的使用

2024-07-12 08:33| 来源: 网络整理| 查看: 265

详细说明 QMatrix类指定坐标系的2D变换。 矩阵指定如何平移,缩放,剪切或旋转坐标系,通常在渲染图形时使用。与QTransform相比,QMatrix不允许透视图转换。 QTransform是Qt中推荐的转换类。 可以使用setMatrix(),scale(),rotate(),translate()和shear()函数来构建QMatrix对象。或者,可以通过应用基本矩阵运算来构建它。也可以在构造矩阵时对其进行定义,并可以使用reset()函数将其重置为恒等矩阵(默认值)。 QMatrix类支持图形基元的映射:可以使用map()函数将给定的点,线,多边形,区域或绘画路径映射到由此矩阵定义的坐标系。如果是矩形,则可以使用mapRect()函数转换其坐标。也可以使用mapToPolygon()函数将矩形转换为多边形(映射到由此矩阵定义的坐标系)。 QMatrix提供了isIdentity()函数,如果矩阵是单位矩阵,则返回true;以及isInvertible()函数,如果矩阵为非奇异值(即AB = BA = I),则返回true。如果它是可逆的,那么reverse()函数将返回此矩阵的一个反向副本(否则它将返回单位矩阵)。另外,QMatrix提供了determinant()函数,该函数返回矩阵的行列式。 最后,QMatrix类支持矩阵乘法,并且可以流化和比较该类的对象。 渲染图形 渲染图形时,矩阵定义了转换,但是实际的转换由QPainter中的绘制例程执行。 默认情况下,QPainter在关联设备自己的坐标系上运行。 QPaintDevice的标准坐标系的原点位于左上角。 x值向右增加; y值向下增加。有关完整说明,请参见坐标系文档。 QPainter具有无需使用QMatrix即可平移,缩放,剪切和旋转坐标系的功能。例如:

在这里插入图片描述

void SimpleTransformation::paintEvent(QPaintEvent *) { 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, "QMatrix"); }

尽管这些函数非常方便,但如果要执行多个转换操作,则构建QMatrix并调用QPainter :: setMatrix()可能会更加高效。 例如: 在这里插入图片描述

void CombinedTransformation::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setPen(QPen(Qt::blue, 1, Qt::DashLine)); painter.drawRect(0, 0, 100, 100); QMatrix matrix; matrix.translate(50, 50); matrix.rotate(45); matrix.scale(0.5, 1.0); painter.setMatrix(matrix); painter.setFont(QFont("Helvetica", 24)); painter.setPen(QPen(Qt::black, 1)); painter.drawText(20, 10, "QMatrix"); }

基本矩阵运算 在这里插入图片描述 一个QMatrix对象包含一个3 x 3的矩阵。 dx和dy元素指定水平和垂直平移。 m11和m22元素指定水平和垂直缩放。最后,m21和m12元素指定水平和垂直剪切。 QMatrix使用以下公式将平面中的一个点转换为另一个点:

x'= m11 * x + m21 * y + dx y'= m22 * y + m12 * x + dy

点(x,y)是原始点,而(x’,y’)是变换点。通过对倒置()矩阵执行相同的运算,可以将(x’,y’)转换回(x,y)。 构造矩阵时可以设置各种矩阵元素,或者稍后使用setMatrix()函数来设置。也可以使用translate(),rotate(),scale()和shear()便利函数进行操作。可以使用m11(),m12(),m21(),m22(), dx()和dy()函数。 翻译是最简单的转换。设置dx和dy将使坐标系dx单位沿X轴移动,并且dy单位沿Y轴移动。缩放可以通过设置m11和m22来完成。例如,将m11设置为2,将m22设置为1.5将使高度加倍并将宽度增加50%。单位矩阵的m11和m22设置为1(所有其他设置为0),将一个点映射到其自身。剪切受m12和m21的控制。将这些元素设置为非零值将扭曲坐标系。通过仔细设置剪切因子和比例因子可以实现旋转。 这是使用基本矩阵运算的组合转换示例: 在这里插入图片描述

void BasicOperations::paintEvent(QPaintEvent *) { double pi = 3.14; double a = pi/180 * 45.0; double sina = sin(a); double cosa = cos(a); QMatrix translationMatrix(1, 0, 0, 1, 50.0, 50.0); QMatrix rotationMatrix(cosa, sina, -sina, cosa, 0, 0); QMatrix scalingMatrix(0.5, 0, 0, 1.0, 0, 0); QMatrix matrix; matrix = scalingMatrix * rotationMatrix * translationMatrix; QPainter painter(this); painter.setPen(QPen(Qt::blue, 1, Qt::DashLine)); painter.drawRect(0, 0, 100, 100); painter.setMatrix(matrix); painter.setFont(QFont("Helvetica", 24)); painter.setPen(QPen(Qt::black, 1)); painter.drawText(20, 10, "QMatrix"); }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3