「QT」几何数据类 之 QLineF 浮点型直线类
✨博客主页 | ||
---|---|---|
何曾参静谧的博客 | ||
📌文章专栏 | ||
「QT」QT5程序设计 | ||
📚全部专栏 | ||
「VS」Visual Studio | 「C/C++」C/C++程序设计 | 「UG/NX」BlockUI集合 |
「Win」Windows程序设计 | 「DSA」数据结构与算法 | 「UG/NX」NX二次开发 |
「QT」QT5程序设计 | 「File」数据文件格式 | 「PK」Parasolid函数说明 |
「Math」探秘数学世界 |
目录
- QLineF类详解
- 一、引言
- 二、使用范围
- 三、类的头文件
- 四、类的构造介绍
- 五、共有函数介绍
- 六、Static函数介绍
- 七、运算符重载
- 八、详细代码举例
QLineF类详解
一、引言
QLineF是Qt框架中的一个关键类,用于表示二维平面上的直线段,与QLine类不同的是,QLineF使用浮点数(通常是double类型)来表示坐标,这使得它能够处理更高精度的图形操作。QLineF类提供了丰富的功能,包括计算直线长度、直线段的平移、判断点与直线的关系等,是Qt图形编程中不可或缺的工具之一。
二、使用范围
QLineF类广泛应用于需要高精度图形操作的Qt应用程序中。例如,在绘制复杂图形、进行图形变换、进行碰撞检测等场景中,QLineF的浮点数坐标能够提供更精确的结果。此外,QLineF还可以与Qt的其他图形类(如QPolygonF、QRectF等)无缝集成,共同构建出丰富的图形界面。
三、类的头文件
要使用QLineF类,需要在代码中包含其头文件<QLineF>
。这个头文件定义了QLineF类的所有成员和函数,使得开发者可以在自己的Qt应用程序中方便地使用该类。
#include <QLineF>
四、类的构造介绍
QLineF类提供了多种构造函数,允许以不同的方式创建QLineF对象:
- 默认构造函数:创建一个未初始化的QLineF对象。
QLineF();
- 参数化构造函数:使用两个QPointF对象或四个浮点数坐标(x1, y1, x2, y2)作为起点和终点来创建QLineF对象。
QLineF(qreal x1, qreal y1, qreal x2, qreal y2);
QLineF(const QPointF &p1, const QPointF &p2);
- 从QLine转换的构造函数:虽然QLine使用整数坐标,但QLineF类提供了从QLine到QLineF的转换构造函数,允许将QLine对象转换为QLineF对象(可能会进行精度提升)。
QLineF(const QLine &line);
五、共有函数介绍
QLineF类提供了丰富的共有函数,用于获取直线的属性、进行几何运算等。以下是一些常用的共有函数:
QPointF p1() const
:返回直线的起点。QPointF p2() const
:返回直线的终点。void setP1(const QPointF &p1)
:设置直线的起点。void setP2(const QPointF &p2)
:设置直线的终点。qreal length() const
:返回直线的长度(浮点数)。qreal angle() const
:返回直线的倾斜角(以度为单位,范围从-180到180)。qreal angleTo(const QLineF &l) const
:返回本直线与另一条直线l之间的夹角(以度为单位)。QLineF translated(qreal dx, qreal dy) const
:返回沿向量(dx, dy)平移后的直线。QPointF pointAt(qreal t) const
:返回参数化直线上的点,其中t是介于0和1之间的浮点数,表示从起点到终点的比例距离。
六、Static函数介绍
QLineF类也提供了一些静态函数,用于执行与QLineF对象相关的通用操作。这些函数不需要创建QLineF对象就可以直接使用。以下是一些常用的静态函数:
static QLineF fromPolar(qreal length, qreal angle, QPointF *origin = nullptr)
:根据极坐标(长度和角度)以及可选的原点(默认为原点(0,0))计算直角坐标下的直线。如果提供了origin参数,则直线将相对于该点进行定位。
七、运算符重载
QLineF类重载了多个运算符,以便进行直线之间的比较和算术运算。以下是一些重载的运算符:
bool operator==(const QLineF &line) const
:判断两条直线是否相等(基于起点和终点的坐标)。bool operator!=(const QLineF &line) const
:判断两条直线是否不相等。
八、详细代码举例
以下是一个使用QLineF类的详细代码示例,展示了如何创建QLineF对象、获取直线的属性、进行几何运算以及判断点与直线的关系。
#include <QCoreApplication>
#include <QLineF>
#include <QPointF>
#include <QDebug>
#include <cmath> // 引入cmath库以使用fabs函数计算浮点数绝对值int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建QLineF对象QLineF line(QPointF(10.5, 20.3), QPointF(40.7, 60.1));// 获取直线的属性QPointF start = line.p1();QPointF end = line.p2();qreal length = line.length();qreal angle = line.angle();qDebug() << "Start Point:" << start;qDebug() << "End Point:" << end;qDebug() << "Length:" << length;qDebug() << "Angle:" << angle;// 进行几何运算QLineF translatedLine = line.translated(10.0, -10.0);qDebug() << "Translated Line (Start, End):" << translatedLine.p1() << "," << translatedLine.p2();// 计算直线上的点(参数化)qreal t = 0.5; // 中点QPointF midPoint = line.pointAt(t);qDebug() << "Point at t=" << t << ":" << midPoint;// 判断点与直线的关系(点到直线的垂直距离)QPointF testPoint(25.0, 40.0);qreal distance = std::fabs((line.p2().y() - line.p1().y()) * testPoint.x() - (line.p2().x() - line.p1().x()) * testPoint.y() + line.p2().x() * line.p1().y() - line.p2().y() * line.p1().x()) / std::sqrt(std::pow(line.p2().y() - line.p1().y(), 2.0) + std::pow(line.p2().x() - line.p1().x(), 2.0));qDebug() << "Distance from test point to line:" << distance;// 如果需要判断点是否在直线上(考虑到浮点数的精度问题),可以设置一个容差值qreal tolerance = 1e-6; // 容差值,根据实际情况调整if (distance < tolerance) {qDebug() << "Test Point is on the line.";} else {qDebug() << "Test Point is not on the line.";}return a.exec();
}
在这个示例中,我们首先创建了一个QLineF对象line
,并获取了它的起点、终点、长度以及角度。然后,我们进行了平移运算,得到了一个新的QLineF对象translatedLine
。此外,我们还计算了直线上的中点(通过参数化方式),并判断了一个测试点是否在直线上(通过计算点到直线的垂直距离,并设置一个容差值来判断)。需要注意的是,由于QLineF使用浮点数坐标,因此在进行比较和判断时需要考虑到浮点数的精度问题。
相关文章:

「QT」几何数据类 之 QLineF 浮点型直线类
✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…...

Treeland 技术揭秘,如何使得 DDE 纵享丝滑?
近日,deepin(深度)社区亮相COSCon24 第九届中国开源年会开源市集,且社区资深桌面研发工程师张丁元为大家来了《Treeland,DDE进步的阶梯》技术分享。 就着这个机会,今天就让我们一起来聊聊如何在追求华丽动…...

快速了解SpringBoot 统一功能处理
拦截器 什么是拦截器: 拦截器是Spring框架提供的重要功能之一,主要进行拦截用户请求,在指定方法前后,根据业务需求,执行预先设定的代码。 也就是说,允许开发⼈员提前预定义⼀些逻辑,在⽤⼾的请求响应前后执⾏.也可以…...

C++区分数组的引用和引用的数组
void f(int (&arr)[10]) {//正确} void f1(int &arr[10]) {//不允许使用引用的数组} [](数组下标运算符)的优先级高于&(取地址运算符)。所有表达式&arr[i]等价于&(arr[i]) 引用的数组 一个包含引用的数组&…...

【harbor】离线安装2.9.0-arm64架构服务制作和升级部署
harbor官网地址:Harbor 参考文档可以看这里:部署 harbor 2.10.1 arm64 - 简书。 前提环境准备: 安装docker 和 docker-compose 先拉arm64架构的harbor相关镜像 docker pull --platformlinux/arm64 ghcr.io/octohelm/harbor/harbor-regist…...

ESLint 使用教程(五):ESLint 和 Prettier 的结合使用与冲突解决
前言 在现代前端开发中,代码质量与代码风格的统一是两个非常重要的方面。良好的代码质量能减少 bug 的产生,而统一的代码风格则能提高团队协作的效率。为了实现这两个目标,我们通常会使用一些工具。 为了保证代码的可读性和维护性࿰…...

uniApp之uni-file-picker使用踩坑
标题党~也不算坑吧 就是初体验 上传是需要存储一下子的,我以为uniApp是自己免费开的服务给大家中转使用,就没管这个事,但是官网是这么说的: 就我是怎么发现的,使用了一段时间后,上传的图片都裂了ÿ…...

【C语言】。末尼
用js写一个冒泡排序 当然可以。在JavaScript中,你可以使用递归的方式来实现冒泡排序算法。这是一个简单的示例: function bubbleSort(arr) { let len arr.length; if(len < 1){ return arr; // 如果数组只有一个元素或为空…...
【鉴权】深入解析 Token:身份认证的核心技术
目录 引言一、Token 的定义与概念1.1 Token 是什么?1.2 无状态性与自包含性1.3 Token 的工作流程1.3.1 基本工作流程1.3.2 工作流程图示 二、Token 的常见用途2.1 用户身份验证2.2 授权控制2.3 防止跨站请求伪造(CSRF)2.4 跨域认证 三、Token…...

FastReport将停止 .NET Framework 上的 WebReport 更新
从2024/ 12 /1 日起,Fastreport将停止发布更新和提供对 FastReport.Web (.NET Framework) 的技术支持。该库一直是使用 Online Designer 的许多项目中报告的核心。这些更改意味着 FastReport.Web (Legacy) 库(FastReport.Net包的一部分)将不再…...

面试:TCP、UDP如何解决丢包问题
文章目录 一、TCP丢包原因、解决办法1.1 TCP为什么会丢包1.2 TCP传输协议如何解决丢包问题1.3 其他丢包情况(拓展)1.4 补充1.4.1 TCP端口号1.4.2 多个TCP请求的逻辑1.4.3 处理大量TCP连接请求的方法1.4.4 总结 二、UDP丢包2.1 UDP协议2.1.1 UDP简介2.1.2…...
在Ubuntu下安装RabbitMQ、添加一个新的登录用户并设置密码
在Ubuntu下安装RabbitMQ、添加一个新的登录用户并设置密码 在Ubuntu下安装RabbitMQ可以按照以下步骤进行:步骤 1: 更新系统步骤 2: 安装Erlang步骤 3: 添加RabbitMQ仓库步骤 4: 更新APT索引并安装RabbitMQ步骤 5: 启动RabbitMQ服务步骤 6: 检查RabbitMQ状态步骤 7: …...
HTTPS通信和TCP通信有什么不一样
HTTPS通信和TCP通信的主要区别如下: 协议层次:HTTPS是应用层协议,建立在HTTP协议之上,并增加了SSL/TLS加密层;而TCP是传输层协议,提供可靠的数据传输服务。安全性:HTTPS通过SSL/TLS加密…...

Kafka 的一些问题,夺命15连问
kafka-中的组成员 kafka四大核心 生产者API 允许应用程序发布记录流至一个或者多个kafka的主题(topics)。 消费者API 允许应用程序订阅一个或者多个主题,并处理这些主题接收到的记录流 StreamsAPI 允许应用程序充当流处理器(s…...

unity3d————延时函数
1.public void InvokeRepeating(string methodName, float time, float repeatRate); 延迟重复执行函数 InvokeRepeating 参数一:函数名字符串 参数二:第一次执行的延迟时间 参数三:之后每次执行的间隔时间 注意: 1-1.延时函数第…...
计算机学生自我提升方法——善用搜索引擎
计算机学生自我提升方法——善用搜索引擎 在信息爆炸的时代,计算机专业的学生如何有效地自我提升?答案可能就藏在一个简单却强大的工具——搜索引擎中。搜索引擎不仅是获取知识的入口,更是解决问题的利器。下面,我将分享一些善用…...

游戏引擎学习第一天
视频参考: https://www.bilibili.com/video/BV1zGDCYHErA/ 创建一个保存项目的路径 VS的安装略过,个人自行百度 1. vs 创建第一个CMAKE的窗口项目 game.cpp 修改如下的代码 到https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-winmain 去…...
uni-app view循环绑定click和 v-if
<view class"layout-wrap-item" v-for"(item, index) in menuItems" :key"index" click"item.clickHandler" :v-if"showMenu(item)"></view> const xxx (id) > { }; // 定义菜单项数组 const menuItems …...

Redis 高并发分布式锁实战
目录 环境准备 一 . Redis 安装 二:Spring boot 项目准备 三:nginx 安装 四:Jmeter 下载和配置 案例实战 优化一:加 synchronized 锁 优化二:使用 redis 的 setnx 实现分布式锁 优化三:使用 Lua 脚本…...

关于elementui el-radio 赋值问题
今天遇到这样的问题: 点击的时候,同时选中 照抄官网! 后来发现了问题: 也就是说如果你的版本太低,就不能用value,而得用label,于是修改 <el-radio-group v-model"searchTime"&g…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...