当前位置: 首页 > news >正文

「QT」几何数据类 之 QLine 整型直线类

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「QT」QT5程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明
「Math」探秘数学世界

目录

    • QLine类详解
      • 一、引言
      • 二、使用范围
      • 三、类的头文件
      • 四、类的构造介绍
      • 五、共有函数介绍
      • 六、Static函数介绍
      • 七、运算符重载
      • 八、详细代码举例

QLine类详解

一、引言

QLine是Qt框架中的一个核心类,用于表示二维平面上的直线段。与QLineF不同,QLine使用整数坐标(QPoint)来表示起点和终点,这使得它在处理像素级精度的图形绘制和界面布局时更加高效。QLine类提供了丰富的功能,包括直线长度的计算、直线的平移、判断点与直线的关系等,是Qt图形编程和界面设计中的基础工具之一。
官方文档:https://doc.qt.io/qt-5/qline.html

二、使用范围

QLine类广泛应用于Qt的图形界面编程中,特别是在需要精确绘制直线、计算直线长度、进行直线变换、判断点与直线关系等场景中。由于QLine使用整数坐标,因此它非常适合于处理像素级的图形操作,如绘制网格线、边框、分割线等。

三、类的头文件

要使用QLine类,需要包含其头文件<QLine>。这个头文件定义了QLine类的所有成员和函数,使得开发者可以在自己的Qt应用程序中使用该类。

#include <QLine>

四、类的构造介绍

QLine类提供了多种构造函数,允许以不同的方式创建QLine对象:

  1. 默认构造函数:创建一个未初始化的QLine对象。
QLine();
  1. 参数化构造函数:使用两个QPoint对象或四个整数坐标(x1, y1, x2, y2)作为起点和终点来创建QLine对象。
QLine(int x1, int y1, int x2, int y2);
QLine(const QPoint &p1, const QPoint &p2);
  1. 从QLineF转换的构造函数:虽然QLineF使用浮点数坐标,但QLine类提供了从QLineF到QLine的转换构造函数,允许将QLineF对象转换为QLine对象(可能会丢失精度)。
QLine(const QLineF &linef);

五、共有函数介绍

QLine类提供了丰富的共有函数,用于获取直线的属性、进行几何运算等。以下是一些常用的共有函数:

  • QPoint p1() const:返回直线的起点。
  • QPoint p2() const:返回直线的终点。
  • void setP1(const QPoint &p1):设置直线的起点。
  • void setP2(const QPoint &p2):设置直线的终点。
  • int length() const:返回直线的长度(整数)。
  • int dx() const:返回终点的x坐标与起点的x坐标之差。
  • int dy() const:返回终点的y坐标与起点的y坐标之差。
  • QLine translated(int dx, int dy) const:返回沿向量(dx, dy)平移后的直线。
  • QPoint pointAt(int t) const:返回参数化直线上的点,其中t是介于0和直线长度之间的整数,表示从起点到终点的距离。但需要注意的是,这个函数的行为可能与预期不同,因为它直接基于长度进行插值,而不是基于比例。在实际使用中,可能需要使用其他方法来获取特定比例的点。

注意pointAt函数的行为在QLine中可能不是直观的,因为它基于长度进行插值,而不是基于比例。如果你需要基于比例获取点,你可能需要手动计算或使用QLineF类。

六、Static函数介绍

QLine类提供了一些静态函数,用于执行与QLine对象相关的通用操作。这些函数不需要创建QLine对象就可以直接使用。以下是一些常用的静态函数:作者:CSND@何曾参静 谧

  • static int fromPolar(int length, int angle, int *x, int *y):根据极坐标(长度和角度)计算直角坐标(x, y)。这个函数将结果存储在提供的指针中,并返回计算出的x坐标(尽管返回值可能不是必需的,因为这是一个静态函数,并且它已经通过指针修改了x和y的值)。

七、运算符重载

QLine类重载了多个运算符,以便进行直线之间的比较和算术运算。以下是一些重载的运算符:

  • bool operator==(const QLine &line) const:判断两条直线是否相等(基于起点和终点的坐标)。
  • bool operator!=(const QLine &line) const:判断两条直线是否不相等。

八、详细代码举例

以下是一个使用QLine类的详细代码示例,展示了如何创建QLine对象、获取直线的属性、进行几何运算以及判断点与直线的关系。

#include <QCoreApplication>
#include <QLine>
#include <QPoint>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建QLine对象QLine line(QPoint(10, 20), QPoint(40, 60));// 获取直线的属性QPoint start = line.p1();QPoint end = line.p2();int length = line.length();int dx = line.dx();int dy = line.dy();qDebug() << "Start Point:" << start;qDebug() << "End Point:" << end;qDebug() << "Length:" << length;qDebug() << "Dx:" << dx;qDebug() << "Dy:" << dy;// 进行几何运算QLine translatedLine = line.translated(10, -10);qDebug() << "Translated Line (Start, End):" << translatedLine.p1() << "," << translatedLine.p2();// 判断点与直线的关系(此处示例为点是否在直线上,但QLine没有直接提供此功能,需自行计算)// 我们可以计算点到直线两端点的距离之和,如果等于直线的长度,则点在直线上(考虑整数坐标的精度问题)QPoint testPoint(25, 40); // 这个点实际上在直线上(考虑整数坐标)int distanceToStart = QPoint(line.p1().x() - testPoint.x(), line.p1().y() - testPoint.y()).manhattanLength();int distanceToEnd = QPoint(line.p2().x() - testPoint.x(), line.p2().y() - testPoint.y()).manhattanLength();if (distanceToStart + distanceToEnd == length) {qDebug() << "Test Point is on the line.";} else {qDebug() << "Test Point is not on the line.";}// 注意:上述判断方法存在精度问题,因为对于非整数坐标的点,这种方法可能会失败。// 在实际应用中,可能需要使用更精确的方法来判断点是否在直线上,比如计算点到直线的垂直距离。// 但由于QLine使用整数坐标,这种精确计算通常不是必需的。return a.exec();
}

作者:CSND@何曾参静谧
在这个示例中,我们首先创建了一个QLine对象line,并获取了它的起点、终点、长度以及x和y方向的差值。然后,我们进行了平移运算,得到了一个新的QLine对象translatedLine。此外,我们还尝试判断一个测试点是否在直线上(通过计算点到直线两端点的曼哈顿距离之和是否等于直线的长度来进行近似判断)。需要注意的是,由于QLine使用整数坐标,因此这种方法在大多数情况下是有效的,但在处理非整数坐标时可能会失败。在实际应用中,如果需要更精确的判断,可能需要使用其他方法或考虑使用QLineF类。


在这里插入图片描述


http://www.mrgr.cn/news/69671.html

相关文章:

  • 仪表板展示|DataEase看中国:历年双十一电商销售数据分析
  • UNIAPP发布小程序调用讯飞在线语音合成+实时播报
  • 内网对抗-信息收集篇SPN扫描DC定位角色区域定性服务探针安全防护凭据获取
  • 【api】java和python联动
  • 【3D Slicer】的小白入门使用指南四
  • Webpack 1.13.2 执行 shell 命令解决 打印时没有背景色和文字颜色的问题
  • UVC 输出视频格式修改和windows下数据分析
  • 【Linux系统编程】第四十四弹---从TID到线程封装:全面掌握线程管理的核心技巧
  • 树莓派(Raspberry Pi)产品介绍-硬件篇
  • ABC 379 D - Home Garden(队列+前缀和)
  • 「QT」几何数据类 之 QPointF 浮点型点类
  • 免费送源码:Java+springboott+MySQL+Tomcat 游戏攻略网站设计与实现 计算机毕业设计原创定制
  • 基于springboot的公益服务平台的设计与实现
  • 【论文复现】MSA+抑郁症模型总结(三)
  • 国际刑警组织在全球打击网络犯罪行动中捣毁了22000多台恶意服务器!思科为工业无线系统中的关键URWB漏洞发布补丁 | 安全周报1110
  • 人脸识别率低怎么办?如何通过代码提高准确率?
  • 第18篇 :深入剖析systemverilog中 randomize 失败案例启示录(二)
  • JavaAPI(2)
  • 关于git使用的图文教程(包括基本使用,处理冲突问题等等)超详细
  • 在.NET中正确捕获C++程序的cout输出
  • Qt_day4_Qt_UI设计
  • 互联网基础思维
  • 小白速成教程:私有化大模型+知识库
  • 深入解析Python的上下文管理器与资源管理:实现自定义的with语句
  • 简记Vue3(五)—— Pinia
  • windows定时闹钟