一、坐标系简介。

Qt中每一个窗口都有一个坐标系,默认的,窗口左上角为坐标原点,然后水平向右依次增大,水平向左依次减小,垂直向下依次增大,垂直向上依次减小。原点即为(0,0)点,然后以像素为单位增减。

例如:

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setBrush(Qt::red);
    painter.drawRect(0,0,100,100);
    painter.setBrush(Qt::yellow);
    painter.drawRect(-50,-50,100,100);

}

二、坐标系变换。

坐标系变换是利用变换矩阵来进行的,我们可以利用QTransform类来设置变换矩阵,因为一般我们不需要进行更改,所以这里不在涉及。下面我们只是对坐标系的平移,缩放,旋转,扭曲等应用进行介绍。

1.利用translate()函数进行平移变换。

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setBrush(Qt::yellow);
    painter.drawRect(0,0,50,50);

painter.translate(100,100); //将点(100,100)设为原点

painter.setBrush(Qt::red);
    painter.drawRect(0,0,50,50);

painter.translate(-100,-100);

painter.drawLine(0,0,20,20);
}

这里将(100,100)点作为了原点,所以此时(100,100)就是(0,0)点,以前的(0,0)点就是

(-100,-100)点。要想使原来的(0,0)点重新成为原点,就是将(-100,-100)设为原点。

2.利用scale()函数进行比例变换,实现缩放效果。

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setBrush(Qt::yellow);
    painter.drawRect(0,0,100,100);

painter.scale(2,2); //放大两倍

painter.setBrush(Qt::red);
    painter.drawRect(50,50,50,50);
}

painter.scale(2,2),是将横纵坐标都扩大了两倍,现在的(50,50)点就相当于以前的

(100,100)点。

3.利用shear()函数就行扭曲变换。

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setBrush(Qt::yellow);
    painter.drawRect(0,0,50,50);

painter.shear(0,1); //纵向扭曲变形
    painter.setBrush(Qt::red);
    painter.drawRect(50,0,50,50);
}
效果如下。

4.利用rotate()函数进行比例变换,实现缩放效果。

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawLine(0,0,100,0);

painter.rotate(30); //以原点为中心,顺时针旋转30度
    painter.drawLine(0,0,100,0);

painter.translate(100,100);
    painter.rotate(30);
    painter.drawLine(0,0,100,0);
}

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawLine(0,0,100,0);

painter.rotate(30); //以原点为中心,顺时针旋转30度
    painter.drawLine(0,0,100,0);

painter.rotate(-30);

painter.translate(100,100);
    painter.rotate(30);
    painter.drawLine(0,0,100,0);
}

三、坐标系状态的保护。

我们可以先利用save()函数来保存坐标系现在的状态,然后进行变换操作,操作完之后,再用restore()函数将以前的坐标系状态恢复,其实就是一个入栈和出栈的操作。

例如:

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.save(); //保存坐标系状态
    painter.translate(100,100);
    painter.drawLine(0,0,50,50);

painter.restore(); //恢复以前的坐标系状态
    painter.drawLine(0,0,50,50);
}
效果如下。

QPainter中坐标系变换问题相关推荐

  1. 中心对称又是轴对称的图形_解读坐标系中图形变换的规律

    图形的对称.平移.旋转与位似是初中数学中几种重要的图形变换问题,也是各地中考的难点.解决这类问题需在平面直角坐标系中作出变换的图形,或根据图形变换求点的坐标:需要综合运用图形变换的性质特征,运用点的坐 ...

  2. 理解计算机3D图形学中的坐标系变换

    要谈坐标系变换,那么坐标系有哪些呢?依次有:物体坐标系,世界坐标系,相机坐标系,投影坐标系以及屏幕坐标系.我要讨论的就是这些坐标系间的转换.      这些坐标系不是凭空而来,他们都是为了完成计算机3 ...

  3. (五)carla中世界坐标系与相机坐标系、像素坐标系变换

    (五)carla中世界坐标系与相机坐标系.像素坐标系变换 由于实验需要将 carlacarlacarla 中世界坐标系下的坐标点画到相机采集的前视图上,故需要进行坐标系之间的转换. 转换中遇到的问题 ...

  4. 研究相机和IMU坐标系变换

    刚开始录制的数据时没有考虑相机和IMU之间的坐标变换,但是后来发现跟踪效果不好,去查验imu数据时,发现,我采集保存的imu数据格式没有和euroc数据集中的imu数据保存格式统一,所以需要研究的是在 ...

  5. orocod_kdl学习(一):坐标系变换

    KDL中提供了点(point).坐标系(frame).刚体速度(twist),以及6维力/力矩(wrench)等基本几何元素,具体可以参考 Geometric primitives 文档. Creat ...

  6. ggplot2_coor_xxx()坐标系变换

    作者:Li_Yuhui 四川大学研究生在读 本文是ggplot2_可视化_速成的第2节 第3节:scale_xxx()标度调整 第4节:facet_xxx()分面系统 第5节:Guides图例与增加坐 ...

  7. 古月居 ROS 入门21讲--PA17 ROS中坐标系管理系统笔记

    古月居 ROS 入门21讲--PA17 ROS中坐标系管理系统笔记 1.TF 功能包功能 ∙ \bullet ∙ 五秒钟之前,机器人头部坐标系相当于全局坐标系的关系是怎样的? ∙ \bullet ∙机 ...

  8. (七) carla真实世界坐标系与全局俯视地图像素坐标系变换

    (七) carla真实世界坐标系与全局俯视地图像素坐标系变换 问题陈述 下图为 carlacarlacarla 中 Town07Town07Town07 的真实世界. 下图为 carlacarlaca ...

  9. 一、Mahony姿态解算——坐标系变换

    坐标系 在飞行器姿态解算中,通常以地球坐标系(E系)为绝对坐标系,以机体坐标系(B系)为相对坐标系,并通常设初始状态时E系和B系重合. 坐标系变换 我们将空间中某一向量从一个坐标系,通过坐标系变换,映 ...

最新文章

  1. rsa python实现_RSA算法python实现
  2. 【OpenCV3】图像通道分离与合并——cv::split()与cv::merge()详解
  3. 【杂谈】关于批量采购与教材试点深度学习之图像识别,模型设计,人脸图像处理书籍相关问题...
  4. 我的世界boat运行库JAVA10_我的世界boatmod模组大全
  5. vue v-show指令
  6. 为什么要用dubbo,dubbo和zookeeper关系
  7. C/C++学习之路: 继承
  8. c++ 检查缓冲大小与记录大小是否匹配_后端程序员不得不会的 Nginx 转发匹配规则...
  9. 从工程文化和运维理念理解Netflix
  10. 相约11月25日,开发者的嘉年华
  11. html页面缓存meta,html中怎么用meta语句禁用页面缓存?
  12. 数据结构之图的遍历:深度优先遍历(DFS)
  13. app.vue 跳转页面_【在线教学】第8章 网站页面布局和模块设计
  14. JS 实现 Tab标签切换功能
  15. Java基础练习之流程控制(四)
  16. Python机器学习工具箱
  17. 运筹优化(十一)--无约束非线性规划
  18. 学校计算机学院教学管理ER图,学校课程管理ER图
  19. Msm8960(APQ8064)平台的MSM-AOSP-kitkat编译适配(1):基础知识
  20. 2022最新QQ协议登陆,QQ密码加密源代码

热门文章

  1. 深入浅出 Java 中 JVM 内存管理
  2. Docker inspect 命令
  3. API网关Kong系列(二)部署
  4. NanoHttpd源码分析
  5. JPA-CascadeType四个属性的讲解
  6. The Struts dispatcher cannot be found异常的解决方法
  7. add-apt-repository:找不到命令_手把手教你使用nodejs编写cli(命令行)
  8. 五一假期将至,机房维护工作要做好
  9. 智能电源分配PDU应用
  10. Html5table控件,Table Web 控件、TableRow Web 控件及TableCell Web 控件