QTransform(QMatrix)在绘图中指定中心点进行旋转

在图形处理过中,学习前辈的代码时,用到了QMatrix来旋转图形,没有得到想达成的目标。查阅资料得知:QMatrix是QT5以前QTransform的前身,相比QTransform功能一致但要更弱,所以在QT 5的环境下完全可以忽略QMatrix,即使遇到了旧工程用到了QMatrix 也可以将其当作 QTransform 处理。因此两个类可以使用较新的QTransform来处理。这不是重点,重点的是,我想的是指定中心旋转图形,得到的时以屏幕左上角为中心旋转的图形。

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);



       painter.setBrush(QColor(0, 200, 250, 200)); //设置填充颜色
       painter.setPen(QPen(Qt::red,20)); //设置画笔的颜色和宽度。若不设置画笔,则画家会以默认宽度和颜色的画笔来绘制边线
       painter.drawPie(QRect(50, 50, 500, 500), 0, 260 * 16);

       painter.drawLine(QPointF(0,0),QPointF(300,300));//起始辅助线
       QTransform transform;
       //transform.translate(300,300);移动坐标起始点到300,300的位置(起始位0,0)为屏幕左上角
       transform.rotate(10);

       painter.setTransform(transform);
       painter.drawLine(QPointF(0,0),QPointF(300,300));//旋转后的辅助线
        painter.drawPie(QRect(50, 50, 500, 500), 0, 260 * 16);
      // painter.drawPie(QRect(-250, -250, 500, 500), 0, 260 * 16);

}

在这里插入图片描述

上图中从可以明显的看出,图形的旋转是以左上角为圆点旋转的。

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);



       painter.setBrush(QColor(0, 200, 250, 200)); //设置填充颜色
       painter.setPen(QPen(Qt::red,20)); //设置画笔的颜色和宽度。若不设置画笔,则画家会以默认宽度和颜色的画笔来绘制边线
       painter.drawPie(QRect(50, 50, 500, 500), 0, 260 * 16);

       painter.drawLine(QPointF(0,0),QPointF(300,300));//起始辅助线
       QTransform transform;
       transform.translate(300,300);//移动坐标起始点到300,300的位置(起始位0,0)为屏幕左上角
       //transform.rotate(10);

       painter.setPen(QPen(Qt::green,20));
       painter.setTransform(transform);
       painter.drawLine(QPointF(0,0),QPointF(300,300 ));//旋转后的辅助线
       // painter.drawPie(QRect(50, 50, 500, 500), 0, 260 * 16);
       painter.drawPie(QRect(50, 50, 500, 500), 0, 260 * 16);

}

在这里插入图片描述
上图可以看出如果transform.translate(300,300)移动后,坐标系是整体移动到以300,300,为坐标系的起始点

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);



       painter.setBrush(QColor(0, 200, 250, 200)); //设置填充颜色
       painter.setPen(QPen(Qt::red,20)); //设置画笔的颜色和宽度。若不设置画笔,则画家会以默认宽度和颜色的画笔来绘制边线
       painter.drawPie(QRect(50, 50, 500, 500), 0, 260 * 16);

       painter.drawLine(QPointF(0,0),QPointF(300,300));//起始辅助线
       QTransform transform;
       transform.translate(300,300);//移动坐标起始点到300,300的位置(起始位0,0)为屏幕左上角
       transform.rotate(10);

       painter.setPen(QPen(Qt::green,20));
       painter.setTransform(transform);
       painter.drawLine(QPointF(-300,-300),QPointF(0,0 ));//旋转后的辅助线
       // painter.drawPie(QRect(50, 50, 500, 500), 0, 260 * 16);
       painter.drawPie(QRect(-250, -250, 500, 500), 0, 260 * 16);

}

在移动完坐标系之后绘图,只有将图形的坐标系反向移动,并旋转,才能到达,以饼型的中心为远点进行旋转的效果在这里插入图片描述

<think>我们讨论的是QMatrix设置缩放倍率为100%的情况。在QMatrix中,缩放倍率为100%意味着不进行缩放,即缩放因子为1.0。默认情况下,QMatrix的初始状态就是单位矩阵,其中水平和垂直缩放因子均为1.0,因此设置缩放倍率100%实际上就是保持原样,不需要额外的缩放操作。 ### 关键点: 1. **QMatrix的初始状态**:创建QMatrix对象时,它默认是一个单位矩阵,即: ``` [1 0 0] [0 1 0] [0 0 1] ``` 其中,m11(水平缩放)和m22(垂直缩放)均为1.0。 2. **设置缩放倍率100%**: - 如果我们执行`matrix.scale(1.0, 1.0)`,这相当于没有进行任何缩放,因为缩放因子为1.0。 - 因此,设置100%缩放倍率实际上就是保留默认状态,或者将缩放因子重置为1.0。 3. **应用场景**: - 当需要重置缩放时,可以显式调用`scale(1.0, 1.0)`来覆盖之前的缩放变换,但通常更常见的做法是重置整个矩阵(使用`reset()`)或者创建一个新的QMatrix。 ### 代码示例: ```cpp #include <QMatrix> // 示例1:创建默认QMatrix(已经是100%缩放) QMatrix matrix1; // 此时缩放为100% // 示例2:重置缩放至100%(如果之前有变换) QMatrix matrix2; // ... 进行了一些变换后,想重置缩放 matrix2.reset(); // 重置整个矩阵为单位矩阵(缩放100%) // 示例3:显式设置缩放为100%(不改变其他变换) // 假设matrix3已经有一些变换,但我们只想将缩放部分重置为100%而不改变平移等 // 注意:这需要分解矩阵,通常不推荐。更简单的方法是重新设置整个矩阵。 ``` ### 注意事项: - 直接设置缩放因子为1.0并不会取消之前的缩放,而是将当前缩放乘以1.0(即不变)。所以,如果之前有缩放,那么`scale(1.0,1.0)`并不能重置缩放,它只是增加了一个无效果的缩放操作。 - 要真正重置缩放,需要重置整个矩阵(使用`reset()`方法)或者保存初始状态。 §§相关问题§§ 1. 在QMatrix中,reset()方法除了重置缩放因子外,还会重置哪些变换参数? 2. 如果已经进行了旋转或平移变换,如何单独将缩放因子重置为100%而不影响其他变换? 3. 在QMatrix中多次连续调用scale(1.0, 1.0)会对矩阵产生什么影响? 4. QMatrix的缩放因子为1.0时,其内部矩阵表示中哪些元素的值会发生变化? </think> 在QT的`QMatrix`中设置缩放倍率为100%(即无缩放效果),本质是将缩放因子设置为1.0。以下是详细解释和操作方法: ### 核心概念 1. **缩放倍率100%** 表示不进行任何缩放,相当于水平/垂直缩放因子均为 `1.0` 2. **默认状态**:新建的`QMatrix`对象默认就是100%缩放(单位矩阵状态) 3. **重置操作**:若需从其他缩放状态恢复至100%,需显式设置缩放因子或重置矩阵 ### 代码实现 #### 方法1:创建新矩阵(默认100%缩放) ```cpp QMatrix matrix; // 默认构造时自动为100%缩放 // 验证:m11(水平缩放)和m22(垂直缩放)均为1.0 qDebug() << matrix.m11(); // 输出1.0 qDebug() << matrix.m22(); // 输出1.0 ``` #### 方法2:显式设置100%缩放 ```cpp QMatrix matrix; matrix.scale(2.0, 0.5); // 先设置非100%缩放 matrix.scale(1.0, 1.0); // 重置为100%缩放(实际无效操作) // 正确做法:直接重置整个矩阵 matrix.reset(); // 恢复到100%缩放状态 ``` #### 方法3:通过单位矩阵赋值 ```cpp QMatrix matrix = QMatrix(); // 显式创建单位矩阵 // 或 matrix.setMatrix(1.0, 0.0, 0.0, 1.0, 0.0, 0.0); // 手动设置单位矩阵参数 ``` ### 注意事项 1. **`scale(1.0, 1.0)`无效性**:该调用不会改变现有矩阵状态(因1.0是乘法单位元) 2. **复合变换中的影响**:在缩放链中插入100%缩放不会改变最终效果 3. **性能优化**:避免不必要的缩放操作,直接使用默认矩阵 4. **视觉等效**:100%缩放时,`map()`函数返回坐标与原始坐标相同
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值