Qt 坐标系统和坐标变换

news2025/1/11 21:57:05

一、概述:
1、QPainter在QPaintDevice上绘图的默认坐标系统是,原点(0,0)在左上角,x轴正方向水平向右,y轴正方向竖直向下的坐标系。


2、为了绘图的方便,QPainter提供了一些坐标变换的功能,通过平移、旋转、缩放等坐标变换,得到一个逻辑坐标系统(变换坐标系),有时候绘图更方便。


二、QPainter有关坐标变换操作的函数:
1、坐标平移:
  (1)、void translate(qreal dx, qreal dy)。
  (2)、表示将坐标系统水平方向平移dx个单位,垂直方向平移dy个单位,坐标原点平移到新的点。 在缺省的坐标系统中,单位是像素。
  (3)、假设一个绘图窗口宽300像素,高200像素,原始坐标系统执行translate(150,100),则平移后的坐标系统,原点在窗口的中心,x轴正方向水平向右,y轴正方向竖直向下,左上角点坐标变为(-150,-100),右下角点坐标变为(150,100)。


2、坐标旋转:
  (1)、void rotate(qreal angle)。
  (2)、表示将坐标系统绕坐标原点顺时针旋转angle角度,单位是度。
  (3)、当angle是正数时是顺时针旋转,是负数时是逆时针旋转。
  (4)、假设将1平移后的坐标系统,执行rotate(90),则旋转后的坐标系统,原点在窗口的中心,x轴正方向竖直向下,y轴正方向水平向左,左上角点坐标为(-100, 150),右下角点坐标为(100, -150)。


3、坐标缩放:
  (1)、void scale(qreal sx, qreal sy)。
  (2)、表示将坐标系统x方向缩放sx,y方向缩放sy,比例大于1是放大,小于1是缩小。 (理解: sx=2,则坐标系x轴每个间隔变为原先2倍)


4、状态保存:
  (1)、void save()。
  (2)、QPainter内部有一个坐标变换矩阵,save()保存当前坐标状态,就是将当前状态压入堆栈。


5、状态恢复:
  (1)、void restore()。
  (2)、Qpainter恢复上次保存的坐标状态,就是从堆栈中弹出上次的状态。
  (3)、save()和restore()得配对使用,操作的是一个堆栈对象。


6、复位所有坐标变换:
  (1)、void resetTransform()。
  (2)、QPainter复位所有坐标变换,恢复原始的坐标系统。
  


  
三、绘制3个五角星的程序实例:

void Widget::paintEvent(QPaintEvent * event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    QPen pen;
    pen.setColor(Qt::blue);
    pen.setStyle(Qt::SolidLine);
    painter.setPen(pen);

    QBrush brush;
    brush.setColor(Qt::yellow);
    brush.setStyle(Qt::SolidPattern);
    painter.setBrush(brush);

    QFont font;
    font.setPointSize(10);
    font.setBold(true);
    painter.setFont(font);

    qreal R = 100;

    //度转弧的公式: 弧度 = 角度 * (Pie / 180)
    //1度等于Pie/180弧度
    qreal deg = (360 / 5) * (3.14159 / 180);

    QPoint points[5] = {
        QPoint(R, 0),
        QPoint(R * std::cos(deg), -R * std::sin(deg)),
        QPoint(R * std::cos(2 * deg), -R * std::sin(2 * deg)),
        QPoint(R * std::cos(3 * deg), -R * std::sin(3 * deg)),
        QPoint(R * std::cos(4 * deg), -R * std::sin(4 * deg))
    };

    QPainterPath starPath;
    starPath.moveTo(points[0]);
    starPath.lineTo(points[2]);
    starPath.lineTo(points[4]);
    starPath.lineTo(points[1]);
    starPath.lineTo(points[3]);
    starPath.closeSubpath();
    starPath.addText(points[0], font, "0");
    starPath.addText(points[1], font, "1");
    starPath.addText(points[2], font, "2");
    starPath.addText(points[3], font, "3");
    starPath.addText(points[4], font, "4");

    painter.save();
    painter.translate(120, 120);
    painter.drawPath(starPath);
    painter.drawText(0, 0, "S1");

    painter.restore();
    painter.translate(300, 120);
    painter.rotate(90);
    painter.scale(0.8, 0.8);
    painter.drawPath(starPath);
    painter.drawText(0, 0, "S2");

    painter.resetTransform();
    painter.translate(500, 120);
    painter.rotate(-90);
    painter.scale(1.1, 0.8);
    painter.drawPath(starPath);
    painter.drawText(0, 0, "S3");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2275137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

#渗透测试#网络安全# 一文了解什么是跨域CROS!!!

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

国产编辑器EverEdit - 扩展脚本:关闭所有未修改文档

1 扩展脚本:关闭所有未修改文档 1.1 应用场景 当用户打开过多文档时,部分文档已经修改,而大部分没有修改,为了减少在众多已打开文档中来回跳转的不便,可以将没有修改的文档全部关闭,但目前提供的快速关闭窗…

IIS部署.NetCore/.Net8/.Net9项目(从装环境到配置Swagger)

一、介绍 随着.NetCore开源、以及版本的更新迭代,.NetCore的性能越来越好、功能也越来越丰富,作为纯后端提供Api已经变得越来越频繁,与之配套的接口组件Swagger也成为很多人的选择。下面介绍在IIS上部署Swagger的详细过程。 二、安装IIS服务…

第R4周:LSTM-火灾温度预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 文章目录 一、代码流程1、导入包,设置GPU2、导入数据3、数据集可视化4、数据集预处理5、设置X,y6、划分数据集7、构建模型8、定义训练函…

【python自写包模块的标准化方法】

目标: 自写一个包,提供关于字符串和文件的模块 要求对异常可以检测 str_tools.py: def str_reverse(s):""":param s: 传入的字符串:return: 反转后的字符串"""# i -1# j 0# s2 ""# while i > (-len(s)):# s2 s[i]# …

Win10本地部署大语言模型ChatGLM2-6B

鸣谢《ChatGLM2-6B|开源本地化语言模型》作者PhiltreX 作者显卡为英伟达4060 安装程序 打开CMD命令行,在D盘新建目录openai.wiki if not exist D:\openai.wiki mkdir D:\openai.wiki 强制切换工作路径为D盘的openai.wiki文件夹。 cd /d D:\openai.wik…

【简博士统计学习方法】第1章:1. 统计学习的定义与分类

自用笔记 1. 统计学习的定义与分类 1.1 统计学习的概念 统计学习(Statistical Machine Learning)是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科。 以计算机和网络为平台;以数据为研究对象;以…

Unity 人体切片三维可视化,可任意裁切切割。查看不同断层的图像。

Unity 人体切片三维可视化,真彩色,可任意裁切切割。查看不同断层的图像。 点击查看效果: 视频效果

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图)

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图) 前面的两篇博文简述了AutoSAR CP分层架构的概念,下面我们来具体到每一层的具体内容进行讲解,每一层的每一个功能块力求用一个总览图,外加一个例子的图给大家进…

科研绘图系列:R语言绘制Y轴截断分组柱状图(y-axis break bar plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍特点意义加载R包数据下载导入数据数据预处理画图输出总结系统信息介绍 Y轴截断分组柱状图是一种特殊的柱状图,其特点是Y轴的刻度被截断,即在某个范围内省略了部分刻度。这种图表…

慧集通(DataLinkX)iPaaS集成平台-数据流程之流程透明化调试功能简介

在线运行流程 查看运行状态 流程第一次执行状态显示 流程第二次执行状态显示(由于订单已同步到七星ERP中,由于还是这些订单所以第二次同步时就报错了) 点击查看节点组件的详细入参与出参信息 U8C销售订单读取组件执行时详情 入参-查询条件…

PostgreSQL技术内幕22:vacuum full 和 vacuum

文章目录 0.简介1.概念及使用方式2.工作原理2.1 主要功能2.2 清理流程2.3 防止事务id环绕说明 3.使用建议 0.简介 在之前介绍MVCC文章中介绍过常见的MVCC实现的两种方式,一种是将旧数据放到回滚段,一种是直接生成一条新数据(对于删除是不删除…

kubernetes第七天

1.影响pod调度的因素 nodeName 节点名 resources 资源限制 hostNetwork 宿主机网络 污点 污点容忍 Pod亲和性 Pod反亲和性 节点亲和性 2.污点 通常是作用于worker节点上,其可以影响pod的调度 语法:key[value]:effect effect:[ɪˈfek…

【CSS】HTML页面定位CSS - position 属性 relative 、absolute、fixed 、sticky

目录 relative 相对定位 absolute 绝对定位 fixed 固定定位 sticky 粘性定位 position:relative 、absolute、fixed 、sticky (四选一) top:距离上面的像素 bottom:距离底部的像素 left:距离左边的像素…

Redis数据库——Redis快的原因

本文详细介绍redis为什么这么快的原因,这里是本系列文章的总结篇(后面会补充一些内容,或者在原文上进行更新迭代),将从各方面出发解释为什么redis快,受欢迎的原因。 文章目录 内存内存数据库预分配内存 数据…

排序:插入、选择、交换、归并排序

排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,…

RocketMQ 和 Kafka 有什么区别?

目录 RocketMQ 是什么? RocketMQ 和 Kafka 的区别 在架构上做减法 简化协调节点 简化分区 Kafka 的底层存储 RocketMQ 的底层存储 简化备份模型 在功能上做加法 消息过滤 支持事务 加入延时队列 加入死信队列 消息回溯 总结 来源:面试官:RocketMQ 和 Kafka 有…

赛车微型配件订销管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 赛车微型配件行业通常具有产品多样性、需求不确定性、市场竞争激烈等特点。配件供应商需要根据市场需求及时调整产品结构和库存,同时要把握好供应链管理和销售渠道。传统的赛车微型配件订销管理往往依赖于人工经验和简单的数据分析,效率低下且容易…

公众号如何通过openid获取unionid

通过接口 https://api.weixin.qq.com/cgi-bin/user/info?access_tokenxxxxxxx&langzh_CN 返回的数据如下: 前提是必须绑定 微信开放平台 token如何获取呢 代码如下: String tokenUrl "https://api.weixin.qq.com/cgi-bin/token"; …

半导体数据分析: 玩转WM-811K Wafermap 数据集(二) AI 机器学习

一、数据集回顾 前面我们已经基本了解了WM-811K Wafermap 数据集,并通过几段代码,熟悉了这个数据集的数据结构,这里为了方便各位连续理解,让我们再回顾一下: WM-811K Wafermap 数据集是一个在半导体制造领域广泛使用…