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

「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.kler.cn/a/387834.html

相关文章:

  • rhcsa练习(3)
  • 【测试】——Cucumber入门
  • SQL从入门到实战
  • mv指令详解
  • asio中strand用于串行执行task
  • 【开源免费】基于Vue和SpringBoot的贸易行业crm系统(附论文)
  • IP可用端口扫描器工具(bun + typescript)
  • Debezium系列之:Debezium 中的增量快照
  • 数据结构之排序--选择排序详解
  • MATLAB和Python多语高维转录分析
  • 在 Vue 中实现与优化轮询技术
  • JMeter基础篇
  • react useRef
  • 水库汛限水位是什么?如何进行安全监测
  • Android HandlerThread 基础
  • 修复 Ubuntu中 “Command ‘python’ not found” 的错误
  • 软件工程概论项目(一),git环境的配置和平台代码的拉取
  • 电子设计竞赛准备经历分享
  • w025基于SpringBoot网上超市的设计与实现
  • 数据分析:16s扩增子网络分析之SparCC
  • java.lang.NoClassDefFoundError: org/springframework/aot/AotDetector问题解决
  • ubuntu 安装 mongodb 笔记记录
  • LabVIEW编程基础教学(二)--数据类型
  • IEEE 1588:电信网络的精确时间协议 (PTP)
  • 【学习笔记】SAP ABAP——OPEN SQL(一)【SELECT语句】
  • linux服务器vim的四种模式