Qt几何数据类型:QLine类型详解(基础向)

QLine类

   QLine 是 Qt 提供的一个简单的几何类,适用于整数精度的线段表示,用于表示二维空间中的直线段。它主要用于计算和绘图中的基本几何处理。

        如果需要更复杂的功能(如角度计算或长度的浮点表示),可以转为 QLineF。在实际开发中,QLine 通常用于绘图和基本的几何运算。

对于QLine类,封装了以下方法(需包含头文件<QLine>,高精度使用<QLineF>):

(公有方法)

下面从其构造开始,我们逐一来聊聊QLine

公有方法

QLine的构造

   QLine类有如下三个构造函数:

 QLine()QLine(const QPoint &p1, const QPoint &p2)QLine(int x1, int y1, int x2, int y2)

默认构造:

        使用默认构造QLine()构造一个Null线段对象,也就是一个位于原点的点。

    QLine line1;qDebug() << line1;--Output:QLine(QPoint(0,0),QPoint(0,0))

        这里需要注意的是:默认构造出来的是一个起始与终止点都在原点的Null线段,但是空值线段并不是只有首尾都位于原点的点。准确来说坐标系上任一点都可以看作是Null线段。

参数构造:

QLine(const QPoint &p1, const QPoint &p2)

        可以传入两个QPoint类型的点对象来构造出一条线段,其中,p1为线段起始点,p2为线段终点。

    QPoint p1(2,1);QPoint p2(4,5);QLine line1(p1,p2);qDebug() << line1;--Output:QLine(QPoint(2,1),QPoint(4,5))	

QLine(int x1, int y1, int x2, int y2)

        传入四个整数值分别代表起始点,与终点的坐标,并以此来构造QLine对象。x1,y1代表起始点横,纵坐标。x2,y2代表线段终点横,纵坐标。

    QLine line(1,3,6,5);qDebug() << line;--Output:QLine(QPoint(1,3),QPoint(6,5))

p1() p2()

        函数原型:

QPoint QLine::p1() const | QPoint QLine::p2() const

        该方法可以返回该条线段的起点或终点。p1()返回当前QLine对象的起点(注意不是引用),p2()返回当前QLine对象的终点。

    QLine line(2,3,5,7);qDebug() << "Start Point:" << line.p1();qDebug() << "End Point:" << line.p2();--Output:Start Point: QPoint(2,3)End Point: QPoint(5,7)	

x1() x2() y1() y2()

        函数原型:

 int QLine::x1() const |  int QLine::x2() const |  int QLine::y1() const |  int QLine::y2() const

        该方法与p1() p2()类似,均是返回线段起始点与终点的坐标。p1() p2()所返回的是QPoint类型的点,而此方法返回的则是一个整型值。(x1,y1)表示的是线段的起点横纵坐标,(x2,y2)则表示的是线段的终点。

    QLine line(2,3,5,9);qDebug() << "start point: x:" << line.x1() << " y:" << line.y1();qDebug() << "end point: x:" << line.x2() << " y:" << line.y2();--Output:start point: x: 2  y: 3end point: x: 5  y: 9

center()

        函数原型:

 QPoint QLine::center() const

        该方法以QPoint形式返回线段的中点。与计算式(p1() + p2()) / 2是等价的,但是,这个方法是安全的,不会出现溢出问题

        如果 p1()p2() 的值很大,它们的和可能会超过数据类型的最大值,从而导致溢出。而这个方法不会出现类似问题,能够正确计算中心点。

    QPoint p1(2,4);QPoint p2(6,8);QLine line(p1,p2);QPoint center = (p1+p2) / 2;QPoint _center = line.center();qDebug() << "Not_Safe_Center: " << center;qDebug() << "Safe_Center: " << _center;--Output:Not_Safe_Center:  QPoint(4,6)Safe_Center:  QPoint(4,6)

dx() dy()

        函数原型:

 int QLine::dx() const |  int QLine::dy() const

        该方法返回该线段在坐标系中的水平分量(dx)和竖直分量(dy)。在数值上分别等于该线段水平坐标的差值与纵向坐标的差值。

    QLine line1(1,3,5,7);int dx = line1.dx();int dy = line1.dy();qDebug() << "dx:" << dx << "  "<< "dy:" << dy << "  ";--Output:dx: 4    dy: 4

        这个方法通常用于计算线段的斜率或是判断线段的方向。例如,如果 dy() 返回的值为正数,说明线段是从下向上延伸的;如果返回的值为负数,说明线段是从上向下延伸的。

isNull()

        函数原型:

 bool QLine::isNull() const

        该方法用于判断该条线段是否为空线段(即起点与终点重合,为一个点而不成线)。若为空线段则返回true,否则返回false

    QLine line1(1,3,1,3);QLine line2(1,3,5,9);qDebug() << "is line1 Null?" << line1.isNull();qDebug() << "is line2 Null?" << line2.isNull();--Output:is line1 Null? trueis line2 Null? false

setP1() setP2()

        函数原型:

void QLine::setP1(const QPoint &p1) | void QLine::setP2(const QPoint &p2)

        该方法用于重设该条线段的起点与终点。

    QPoint p1(2,6);QPoint p2(4,7);QLine line(p1,p2);qDebug() << "before changing:" << line;line.setP1(QPoint(3,5));line.setP2(QPoint(6,9));qDebug() << "after changing:" << line;--Output:before changing: QLine(QPoint(2,6),QPoint(4,7))after changing: QLine(QPoint(3,5),QPoint(6,9))

setLine()

        函数原型:

void QLine::setLine(int x1, int y1, int x2, int y2)

        该方法是上述重设起点终点的重载类型,上述需要传入两个QPoint类型的对象用于表示起终点,此处需要传入x1,y1,x2,y2分别代表起点与终点的横纵坐标。

    QLine line(1,3,5,7);qDebug() << "before changing:" << line;line.setLine(2,4,6,8);qDebug() << "after changing:" << line;--Output:before changing: QLine(QPoint(1,3),QPoint(5,7))after changing: QLine(QPoint(2,4),QPoint(6,8))

setPoints()

        函数原型:

void QLine::setPoints(const QPoint &p1, const QPoint &p2)

        该方法同样用于设置一条线段的起点与终点,与上述是一样的。接受的是两个 QPoint 对象的引用,分别对应起点(p1),终点(p2)。此处不再重复赘述。

toPointF()

        函数原型:

 QLineF QLine::toLineF() const

        同QPoint类型中的toPointF一样,返回精度更高的QLineF类型。 ​​​​​​​

    QLine line(1,4,5,7);QLineF line_F = line.toLineF();line_F.setLine(1.2,2.4,6.0,5.5);qDebug() << "High Accuracy:" << line_F;--Output:High Accuracy: QLineF(QPointF(1.2,2.4),QPointF(6,5.5))

translate()

        函数原型:

void QLine::translate(const QPoint &offset)

        该方法用于将线段进行平移。参数为QPoint类型的常量引用,并以该引用作为偏移基准对线段进行x,y平移。

        如下列所示,我们向已有线段传入点QPoint(2,3)。可以看到线段整体向x轴正向平移了2个单位,向y轴正向平移了3个单位。

    QLine line1(2,3,4,6);qDebug() << "Before translate:" << line1;line1.translate(QPoint(2,3));  qDebug() << "After translate:" << line1;--Output:Before translate: QLine(QPoint(2,3),QPoint(4,6))After translate: QLine(QPoint(4,6),QPoint(6,9))	

        函数原型:

void QLine::translate(int dx, int dy)

        该方法是上述线段平移方法的重载版本。直接接受两个整型参数作为x与y方向上的偏移量,对原线段进行平移。此处不再给出示例。

translated()

        函数原型:

 QLine QLine::translated(const QPoint &offset) const

         该方法同样是对线段进行平移,参数为QPoint类型的常量引用,也是以该点为基准在x,y方向上平移。所不同的是该方法函数的返回类型是 QLine,表示函数返回一个新的 QLine 对象,它不会修改原线段的值,而是返回一个新的线段。

    QLine origin_line(1,3,5,7);qDebug() << "Before Translate:" << origin_line;QLine changed_line = origin_line.translated(QPoint(2,2));qDebug() << "After Translate:" << changed_line<< "\norigin_line:" << origin_line;--Output:Before Translate: QLine(QPoint(1,3),QPoint(5,7))After Translate: QLine(QPoint(3,5),QPoint(7,9)) origin_line: QLine(QPoint(1,3),QPoint(5,7))

        函数原型:

QLine QLine::translated(int dx, int dy) const

        该方法是上述translated的一个重载形式,此处不再赘述。

重载运算符:

        QLine中重载了==!= 运算符,用于比较两线段对象是否相等或不等。其函数原型如下:

 bool QLine::operator!=(const QLine &line) const |  bool QLine::operator==(const QLine &line) const
    QLine line1(1,3,5,7);QLine line2(QPoint(1,3),QPoint(5,7));QLine line3(1,5,8,7);qDebug() << (line1 == line2);qDebug() << (line1 != line3);--Output:truetrue

至此,QLine类的方法就说完了,QLineF大部分方法与QLine是一致的。


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04上kdump和crash的使用

0.前言 1.引用&#xff1a; 解决Linux内核问题实用技巧之 - Crash工具结合/dev/mem任意修改内存-腾讯云开发者社区-腾讯云 解决Linux内核问题实用技巧之-dev/mem的新玩法-腾讯云开发者社区-腾讯云 ubuntu内核转储分析——kdump和crash的下载和使用_ubuntu kdump-CSDN博客 U…

构建自己的docker的ftp镜像

aarch64系统可运行的docker镜像 构建自己的vsftpd镜像&#xff0c;我是在windows系统下的docker desktop中构建运行于aarch64 GNU/Linux系统的ftp镜像。 系统环境&#xff1a; Welcome to Debian GNU/Linux with Linux x.x.x dockerfile FROM ubuntu:latestUSER rootRUN ap…

【北京迅为】iTOP-4412全能版使用手册-第三十二章 网络通信-TCP套字节

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

JavaScript(JS)的对象

目录 1.array 数组对象 2.String 字符串对象 3.JSON 对象&#xff08;数据载体&#xff0c;进行数据传输&#xff09; 4.BOM 浏览器对象 5.DOM 文档对象&#xff08;了解&#xff09; 1.array 数组对象 定义方式1&#xff1a;var 变量名 new Array(元素列表); 定义方式…

Cannot resolve symbol ‘ActivityThread‘ | Android 语法

背景 ActivityThread 是 Android 系统内部使用的一个类,它位于 android.app 包中,但在 Android SDK 的公共 API 中并没有公开。 由于 ActivityThread 是隐藏的内部类,因此在编写单元测试或功能开发时,无法直接引用它。可以使用反射来访问内部 API,或者使用依赖注入的方式…

AI论文速读 | TimeXer:让 Transformer能够利用外部变量进行时间序列预测

题目&#xff1a; TimeXer: Empowering Transformers for Time Series Forecasting with Exogenous Variables 作者&#xff1a;Yuxuan Wang ; Haixu Wu&#xff08;吴海旭&#xff09; ; Jiaxiang Dong ; Yong Liu ; Yunzhong Qiu ; Haoran Zhang ; Jianmin Wang&#xff08;…

Zustand的学习和应用

Zustand 是一个轻量级的状态管理库&#xff0c;适用于 React 应用程序。它以简单易用、高性能和无模板代码的特性受到开发者的喜爱。 https://zustand.docs.pmnd.rs/guides/tutorial-tic-tac-toe 以下是 Zustand 的核心特点和用法简介&#xff1a; Zustand 核心特点 轻量简…

【从零开始的LeetCode-算法】3274. 检查棋盘方格颜色是否相同

给你两个字符串 coordinate1 和 coordinate2&#xff0c;代表 8 x 8 国际象棋棋盘上的两个方格的坐标。 以下是棋盘的参考图 如果这两个方格颜色相同&#xff0c;返回 true&#xff0c;否则返回 false。 坐标总是表示有效的棋盘方格。坐标的格式总是先字母&#xff08;表示列…

常见问题QA的前端代码

这个的后端代码参见此文 使用语言向量建立常见问题的模糊搜索-CSDN博客https://blog.csdn.net/chenchihwen/article/details/144207262?spm1001.2014.3001.5501 这段代码实现了一个简单的问答页面&#xff0c;页面分为左右两部分&#xff0c;左侧用于展示对话记录&#xff0c…

互联网 Java 面试八股文汇总(2025 最新整理)

我分享的这份 Java 后端开发面试总结包含了 JavaOOP、Java 集合容器、Java 异常、并发编程、Java 反射、Java 序列化、JVM、Redis、Spring MVC、MyBatis、MySQL 数据库、消息中间件 MQ、Dubbo、Linux、ZooKeeper、 分布式 &数据结构与算法等 25 个专题技术点&#xff0c;都…

CTF之密码学(密码特征分析)

一.MD5,sha1,HMAC,NTLM 1.MD5&#xff1a;MD5一般由32/16位的数字(0-9)和字母(a-f)组成的字符串 2.sha1&#xff1a;这种加密的密文特征跟MD5差不多&#xff0c;只不过位数是40&#xff08;sha256&#xff1a;64位&#xff1b;sha512:128位&#xff09; 3.HMAC&#xff1a;这…

Linux 入门——基本指令2

目录 1. 通配符的使用 1&#xff09;基本使用 2&#xff09; 拓展使用 2. cp 文件拷贝 基本使用 3. mv :文件剪切或者文件重命名 4. more 指令 5. less 指令 6. cat ,more , less 指令的区别 7. head 8. tail 9. date 日期&#xff0c;时间相关的指令 1&…

2024年12月3日Github流行趋势

项目名称&#xff1a;Lobe Chat 项目维护者&#xff1a;arvinxx, semantic-release-bot, canisminor1990, lobehubbot, renovate项目介绍&#xff1a;一个开源的、现代化设计的人工智能聊天框架。支持多种AI提供商&#xff08;OpenAI / Claude 3 / Gemini / Ollama / Qwen / De…

vue2+cesium初始化地图

目录 1、在vue2项目中下载cesium 2、安装loader 3、更改vue.config.js中的配置 4、main.js中引入 5、App.vue中设置样式 6、新建map.vue 其中代码如下&#xff1a; 7、在App.vue中使用Map组件 8、效果展示&#xff1a; 1、在vue2项目中下载cesium npm install cesium 可…

CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)

附件 calculate.html <!DOCTYPE html> <html lang"en"> <head><!-- 设置字符编码为 UTF-8&#xff0c;支持多语言字符集 --><meta charset"UTF-8"><!-- 设置响应式视图&#xff0c;确保页面在不同设备上自适应显示 --&…

TYUT设计模式精华版

七大原则 单一职责原则 职责要单一不能将太多的职责放在一个类中 开闭原则 软件实体对扩展是开放的&#xff0c;但对修改是关闭的 里氏代换原则 一个可以接受基类对象的地方必然可以接受子类 依赖倒转原则 要针对抽象层编程&#xff0c;而不要针对具体类编程 接口隔离原则 …

Android 使用OpenGLES + MediaPlayer 获取视频截图

概述 Android 获取视频缩略图的方法通常有: ContentResolver: 使用系统数据库MediaMetadataRetriever: 这个是android提供的类&#xff0c;用来获取本地和网络media相关文件的信息ThumbnailUtils: 是在android2.2&#xff08;api8&#xff09;之后新增的一个&#xff0c;该类为…

论文阅读——量子退火Experimental signature of programmable quantum annealing

摘要&#xff1a;量子退火是一种借助量子绝热演化解决复杂优化问题的通用策略。分析和数值证据均表明&#xff0c;在理想化的封闭系统条件下&#xff0c;量子退火可以胜过基于经典热化的算法&#xff08;例如模拟退火&#xff09;。当前设计的量子退火装置的退相干时间比绝热演…

Vue框架开发一个简单的购物车(Vue.js)

让我们利用所学知识来开发一个简单的购物车 &#xff08;记得暴露属性和方法&#xff01;&#xff01;&#xff01;&#xff09; 首先来看一下最基本的一个html框架 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

瑞芯微方案主板Linux修改系统串口波特率教程,触觉智能RK3562开发板演示

遇到部分串口工具不支持1500000波特率&#xff0c;这时候就需要进行修改&#xff0c;本文以触觉智能RK3562开发板修改系统波特率为115200为例&#xff0c;介绍瑞芯微方案主板Linux修改系统串口波特率教程。 温馨提示&#xff1a;瑞芯微方案主板/开发板串口波特率只支持115200或…