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

news2024/12/5 9:56:07

目录

QPoint类

QPoint的构造

QPoint公有方法

isNull()

rx() ry()

setX() setY()

toCGPoint()

toPointF()

transposed()

x() y()

manhattanLength()

各类重载运算符

QPoint的静态方法

dotproduct()



QPoint类

        在 Qt 框架中,QPoint 是一个简单且常用的类,用于表示二维平面上的点(Point),其坐标通过整型值 ((x, y)) 表示。它是 Qt 的核心数据类型之一,广泛用于处理图形界面和几何计算。对于几何类型,自然离不开点,线,以及面等元素。而这些元素则依赖于相关的坐标系的建立。

        这里先来看看Qt中的坐标系:

在常规的坐标系中,我们可能最常见到的是这种形式:

此类直角坐标系原点通常位于左下角,而qt则与此不同。Qt 使用的是 左手坐标系,并且坐标原点(0,0)通常位于屏幕或窗口的 左上角

  • X轴:从左到右,正方向是向右。

  • Y轴:从上到下,正方向是向下。

这意味着:

  • 窗口左上角的坐标是 (0, 0)

  • X轴增大时,位置向右移动。

  • Y轴增大时,位置向下移动。

                对于QPoint类,其封装了以下方法(注:需要包含相关头文件<QPoint>):

(公有方法)

(静态方法)

        接下来以此为基础,聊聊QPoint类。

QPoint的构造

默认构造:

QPoint()

        默认构造将会生成一个位于原点的点(坐标为(0,0))。

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

参数构造:

 QPoint::QPoint(int xpos, int ypos)

该构造接收两个参数,并以这两个参数为其坐标来构造点。

  • xpos:点的x坐标(横坐标)。

  • ypos:点的y坐标(纵坐标)。

 QPoint p(4,5);
 qDebug() << p;
--Output:
QPoint(4,5)

        有了这两个构造函数,我们便可以在一个二维坐标系中描述出任意一个点的位置。

QPoint公有方法

isNull()

原型:

 bool QPoint::isNull() const

        该方法用于检查某个点是否是空点(即(0,0)点,一般认为没有具体的空间位置)。返回bool类型,若某点x,y坐标均为0则返回true,否则返回false。

 QPoint p1;
 QPoint p2(1,1);
 qDebug() << "is p1 null?" << p1.isNull()
          << "\nis p2 null?" << p2.isNull();
--Output:
is p1 null? true 
is p2 null? false

rx() ry()

原型:

int &rx() | int &ry()

该方法将返回x横坐标(或y纵坐标)的引用,使得用户可以直接对点的坐标点就行操纵:

QPoint p1(4,6);
--p1.rx();
++p1.ry();
qDebug() << p1;
--Output:
QPoint(3,7)

如上示例,可以对其进行自增或自减。

setX() setY()

        函数原型:

void QPoint::setX(int x) | void QPoint::setY(int y)

        该方法需要将其中传入新的x坐标的值(或y坐标的值),用于更新点的空间位置。例如下列我们已经有了一个点p(-3,5).需要将其移到(2,9)的位置:

	QPoint p(-3,5);
    qDebug() << "before move p:" << p;
    p.setX(2);  p.setY(9);
    qDebug() << "after mvoe p:" << p;
    --Output:
    before move p: QPoint(-3,5)
    after mvoe p: QPoint(2,9)	

toCGPoint()

        函数原型:

CGPoint QPoint::toCGPoint() const

        这个函数返回的是一个CGPoint(Core Graphics Point)类型,但是有的朋友可能会发现在Qt强大的帮助手册中却找不到有关该类型的任何信息。这里我们先来简单了解一下何为CGPoint

        Core Graphics 是由苹果公司自主研发的一套图形和绘图框架,用于在 macOS 和 iOS 操作系统上创建和处理图形。它提供了一系列的 API 和工具,允许开发者创建高质量的图形和用户界面。而CGPoint 是 Core Graphics 框架中的一个基本类型,代表一个二维坐标点(与QPoint一样)。

        而我们的Qt使用的是自己的QPoint类型,并没有使用CG框架,因而你自然无法在Qt的帮助手册之中找到有关CGPoint的信息。

但为什么Qt要在QPoint类中提供这么一个方法呢?

        这么做其实主要是为了方便在 Qt 应用程序中使用 Core Graphics 框架的 API。虽然 Qt 有自己的图形和绘图 API,但是有些开发者可能需要使用 Core Graphics 框架的特定功能,而且有的第三方库可能使用的是CGPoint类型的坐标点。 官方提供这么一个API,便省去了手动进行类型转换的麻烦。

        这里我并没有连上CG框架,就不给出演示了。


toPointF()

        函数原型:

QPointF QPoint::toPointF() const

        该方法将会使对应的点对象所描述的二维空间位置的精度提高到浮点精度QPointFQPoint是一样的,唯一的区别是QPointF的精度更高。

    QPoint p_low(1,2);
    qDebug() << "Low Accuracy:" << p_low;
    QPointF p_high = p_low.toPointF();
    p_high.setX(1.5); p_high.setY(2.5);
    qDebug() << "High Accuracy:" << p_high;
    --Output:
    Low Accuracy: QPoint(1,2)
	High Accuracy: QPointF(1.5,2.5)

        如上述用例,当你有一个 QPoint 对象,但是你需要使用浮点数精度来进行计算或表示坐标值时,你可以通过 toPointF() 将其转换为 QPointF 对象。


transposed()

        函数原型:

QPoint QPoint::transposed() const

该方法将会调换当前点的x,y坐标,并将其构造成一个新的QPoint对象返回。

    QPoint p(5,-7);
    qDebug() << "before transposed:" << p;
    qDebug() << "after transposed:" << p.transposed();
    --Output:
    before transposed: QPoint(5,-7)
	after transposed: QPoint(-7,5)

x() y()

        函数原型:

int QPoint::x() const |  int QPoint::y() const

        该方法返回点的横纵坐标。(注意与rx(),ry()方法区别开来,这里返回的不是引用,而是单纯的值)。

    QPoint p(2,6);
    //p.x()++; //invalid.
    int x_coordinate = p.x();
    int y_coordinate = p.y();
    qDebug() << "x:" << x_coordinate
             << "y:" << y_coordinate;
     --Output:
     x: 2 y: 6

manhattanLength()

        函数原型:

int QPoint::manhattanLength() const

该方法用于计算该点与原点之间的曼哈顿距离。何为曼哈顿距离?

(图片源自于百度百科)

        曼哈顿距离是数学当中一种距离的度量方式。我们假设上图为坐标系,原点是位于左下角的点A。点A到右上角点B的直线距离(绿色的线)称之为欧几里得距离。

        在知道点的坐标后我们可以使用勾股定理来求解绿色线段的长度。但是欧几里得距离的计算涉及平方与开平方,计算效率是比较低的。

        因此,引入了曼哈顿距离:两个点在标准坐标系上的绝对轴距总和。曼哈顿距离只涉及加法和绝对值运算,没有平方或平方根,因此比欧几里得距离计算更快,尤其在大规模数据计算时节约资源。上述红色线段便是曼哈顿距离,而蓝色与黄色线段则代表的是等价的曼哈顿距离。

        曼哈顿距离特别适合在网格状空间或离散的环境中使用,它的名称来源于曼哈顿市的街道布局,因为它模拟了在城市的直角网格街道中,从一个点到另一个点的最短路径。

        用一个简单的例子来说:假如你在城市街道中从一个十字路口走到另一个十字路口,你只能沿街道的直线方向(横或竖)行走,不能直接穿过建筑物。曼哈顿距离就是你需要走的水平和垂直路段的总长度。 

        其计算公式如下:

d(P,Q)=∣x2−x1∣+∣y2−y1∣

在Qt中,manhattanLength()方法返回的是该点与原点之间的曼哈顿距离

    QPoint p(6,8);
    int length = p.manhattanLength();  //|6-0|+|8-0|
    qDebug() << length;
    --Output:
    14

qt中若要计算两点之间的曼哈顿距离,根据公式,应先求两点之间的差值,而后再调用该方法返回两点之间的曼哈顿距离:

    QPoint p1(3,4);
    QPoint p2(6,9);
    QPoint diff_point = p2 - p1;  // |6-3|+|9-4|
    qDebug() << "manhattanLength of p1 and p2:" << diff_point.manhattanLength();
	--Output:
	manhattanLength of p1 and p2: 8

各类重载运算符

        从上图可以看到QPoint类型适用于很多基本的运算符。下面统一进行说明:

QPoint类型的加减运算

        QPoint类型重载了+-运算符,在进行此类运算时,qt是将其二维点视为向量,并执行向量中的代数形式的加减运算:

	QPoint p1(4,5);
    QPoint p2(2,8);
    qDebug() << p1 + p2;
    qDebug() << p1 - p2;
    --Output:
    QPoint(6,13)
	QPoint(2,-3)

既然重载了+-,相对应的,+=-=运算符便也适用:

    QPoint p1(4,5);
    QPoint p2(2,8);
    QPoint p3(-6,4);
    p1 += p2;
    qDebug() << "p1 += p2 = " << p1;
    p1 -= p3;
    qDebug() << "p1 -= p3 = " << p1;
    --Output:
    p1 += p2 =  QPoint(6,13)
	p1 -= p3 =  QPoint(12,9)

QPoint类型的乘除运算:

        我们知道数学中,向量乘积有数量积与叉积的概念,但是对于QPoint类只提供了点积向量的数乘运算(至于为什么不提供叉积,因为qt的工作主要涉及的是2D的平面空间,2D空间中的叉积意义并不大):

    //数乘演示
	QPoint p1(4,6);
    QPoint p2(3,7);
    //qDebug() << p1 * p2; //invalid.
    qDebug() << p1 * 2;
    qDebug() << p2 * 3;
    --Output:
    QPoint(8,12)
	QPoint(9,21)	

        数乘可以乘以浮点数,但是相对应得用QPointF类型接收,否则数据会被截断。

    QPoint p1(4,6);
    qDebug() << p1 * 2.1;
    qDebug() << (QPointF)p1 * 2.1;
    --Output:
    QPoint(8,13)
	QPointF(8.4,12.6)

        除法运算应注意精度问题。如果点以整数形式保存,因此结果将四舍五入到最接近的整数。使用QPointF的话可以拿到精确精度。

    QPoint p1(2,3);
    qDebug() << p1 / 2;
    qDebug() << (QPointF)p1 / 2;
    --Output:
    QPoint(1,2)
	QPointF(1,1.5)

        既然满足数乘与除法,则相对应,*=/= 运算符也适用:

    QPoint p1(4,6);
    QPoint p2(2,3);
    p1 *= 4;
    p2 /= 3;
    qDebug() << "p1:" << p1 << " : " << "p2:" << p2;
    --Output:
    p1: QPoint(16,24)  :  p2: QPoint(1,1)

        同时,QPoint也重载了 != ,== 运算符,返回值为bool类型,用于判断两个点是否相等:

    QPoint p(5,2);
    QPoint pt(2,5);
    if (p == pt.transposed()) {
        qDebug() << "The two points are Equaled";
    }
    --Output:
    The two points are Equaled

QPoint的静态方法

dotproduct()

        函数原型:

 int QPoint::dotProduct(const QPoint &p1, const QPoint &p2)

        该方法返回两个向量之间的数量积(点积)。

    QPoint p1(2,6);
    QPoint p2(1,4);
    int dotpro = QPoint::dotProduct(p1,p2);  //(2*1)+(4*6)
    qDebug() << "The dotProduct of p1,p2 is :" << dotpro;
    --Output:
    The dotProduct of p1,p2 is : 26

        至此,QPoint类型已全部介绍完毕了。QPointFQPoint除了精度之外其余是一致的,可直接套用QPoint的方法。


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

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

相关文章

外卖开发(三)开发笔记——AOP实现实现公共字段填充、主键回显、抛异常和事务管理

外卖开发&#xff08;三&#xff09;开发笔记 一、AOP实现实现公共字段填充&#xff08;减少重复工作&#xff09;实现思路自定义注解AutoFill自定义切面AutoFillAspect在Mapper接口上添加AutoFill注解 二、主键回显情况三、抛异常 和 事务管理 一、AOP实现实现公共字段填充&am…

Flutter 1.2:flutter配置gradle环境

1、在android的模块中进行gradle环境配置 ①在 gradle-wrapper.properties文件中将url配置为阿里云镜像&#xff0c;因为gradle的服务器在国外&#xff0c;国内下载非常慢&#xff0c;也可在官网进行下载 gradle版本下载 gradle版本匹配 阿里云镜像gradle下载 可以通过复制链…

神经网络入门实战:(九)分类问题 → 神经网络模型搭建模版和训练四步曲

(一) 神经网络模型搭建官方文档 每一层基本都有权重和偏置&#xff0c;可以仔细看官方文档。 pytorch 官网的库&#xff1a;torch.nn — PyTorch 2.5 documentation Containers库&#xff1a;用来搭建神经网络框架&#xff08;包含所有的神经网络的框架&#xff09;&#xff1b…

达梦数据库文件故障的恢复方法

目录 1、概述 1.1 概述 1.2 环境介绍 2、使用备份集的恢复方法 2.1 实验准备 2.2 误删除“用户表空间数据文件” 2.3 误删除SYSTEM.DBF 2.4 误删除ROLL.DBF 2.5 REDO日志文件 3、无备份集的恢复方法 3.1 误删除“表空间数据文件” 3.2误删除控制文件 3.3 误删除RO…

uniapp进阶技巧:如何优雅地封装request实例

在uniapp开发过程中&#xff0c;合理封装网络请求是提高代码质量和开发效率的关键。本文将介绍一种更为优雅的封装方式&#xff0c;通过创建一个request实例来管理不同类型的HTTP请求。 一、准备工作 在开始封装之前&#xff0c;请确保你的项目中已经安装了uniapp开发环境&…

45 基于单片机的信号选择与温度变化

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DS18B20检测温度&#xff0c;通过三种LED灯代表不同状态。 采用DAC0832显示信号脉冲&#xff0c;通过8位数码管显示温度。 信号脉冲可以根据两个按键分别调整为正弦…

yagmail邮件发送库:如何用Python实现自动化邮件营销?

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

付费版-多媒体云转码视频处理工具-付费系统完整源码搭建-先到先得-本文带完整搭建步骤-优雅草央千澈

付费版-多媒体云转码视频处理工具-付费系统完整源码搭建-先到先得-本文带完整搭建步骤-优雅草央千澈 环境 linuxnginxphp7.1mysql5.6 安装步骤 以下适用于宝塔已经安装好的情况 1.上传源码到你的网站目录 2.访问你的域名&#xff0c;按操作提示进行安装配置&#xff08;如…

java基础概念46-数据结构1

一、引入 List集合的三种实现类使用了不同的数据结构&#xff01; 二、数据结构的定义 三、常见的数据结构 3-1、栈 特点&#xff1a;先进后出&#xff0c;后进先出。 java内存容器&#xff1a; 3-2、队列 特点&#xff1a;先进先出、后进后出。 栈VS队列-小结 3-3、数组 3-…

朗迪锋亮相2024人因工程与智能系统交互国际会议

2024年11月28日至30日&#xff0c;2024人因工程与智能系统交互国际会议在深圳隆重举办。此次大会以推动我国人因工程学科发展为目标&#xff0c;致力于加强国际学术交流&#xff0c;深入探讨人工智能时代的智能系统交互&#xff0c;旨在培育新质生产力&#xff0c;助力经济社会…

Java基础之控制语句:开启编程逻辑之门

一、Java控制语句概述 Java 中的控制语句主要分为选择结构、循环结构和跳转语句三大类&#xff0c;它们在程序中起着至关重要的作用&#xff0c;能够决定程序的执行流程。 选择结构用于根据不同的条件执行不同的代码路径&#xff0c;主要包括 if 语句和 switch 语句。if 语句有…

如何部署vue项目到Github Pages

1.创建vue项目 npm create vitelatest my-vue-app -- --template vue 2.创建github仓库 3.连接仓库 在项目根目录右键选择open git base here&#xff0c;如果没有安装git请先安装git。 初始化仓库 $ git init $ git add . $ git commit -m "init"将项目与仓库连…

Jenkins升级到最新版本后无法启动

1. 场景还原 最近在web界面将jenkins升级到最新版本后&#xff0c;后台无法启动jenkins服务&#xff0c;服务状态如下&#xff1a; 运行jenkins命令提示invalid Java version jenkins --version jenkins: invalid Java version: java version "1.8.0_202" Java(TM)…

「计算机网络性能指标」

速率 速率&#xff08;Speed&#xff09;&#xff1a;指连接到网络上的节点在信道上的传输数据的速率。也称数据率或比特率&#xff0c;数据传输速率 信道&#xff08;Channel&#xff09;&#xff1a;表示向某一方向传送信息的通道&#xff08;信道 ≠ 通信线路&#xff09;…

HTTP协议详解:从HTTP/1.0到HTTP/3的演变与优化

深入浅出&#xff1a;从头到尾全面解析HTTP协议 一、HTTP协议概述 1.1 HTTP协议简介 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最广泛的通信协议之一。它用于客户端与服务器之间的数据传输&#xff0c;尤其是在Web…

【Docker】Docker 容器日志过大导致磁盘爆满

docker容器的日志文件目录位于/var/lib/docker/containers/容器/容器-json.log 查看日志大小 cd /var/lib/docker/containers/ du -h --max-depth1 临时删一点 cd xxxxxxx/ tail -100 xxxxxxx-json.log > xxxxxxx-json.log 如图 解决方式&#xff08;全局&#xff09; …

MySQL 索引创建 大数据查询 性能测试 SQL优化 慢查询

介绍 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些 数据结构以某种方式引用(指向)数据&#xff0c; 这样就可以在这些数据结构上实现高级查找算法&#xff0c;这种数据结构就是…

JAVA:Springboot 集成 WebSocket 和 STOMP 实时消息的技术指南

1、简述 随着互联网应用的复杂性和实时性需求的增加&#xff0c;传统的 HTTP 请求响应模式已不能满足某些场景的需求。WebSocket 和 STOMP 协议为构建实时消息传输提供了极大的便利。本文将介绍如何在 Spring Boot 中使用 WebSocket 和 STOMP 创建一个实时消息应用&#xff0c…

华为仓颉编程环境搭建

1、仓颉介绍 摘自华为官方&#xff1a;仓颉编程语言作为一款面向全场景应用开发的现代编程语言&#xff0c;通过现代语言特性的集成、全方位的编译优化和运行时实现、以及开箱即用的 IDE 工具链支持&#xff0c;为开发者打造友好开发体验和卓越程序性能。 其具体特性表现为&am…

Vue+Elementui el-tree树只能选择子节点并且支持检索

效果&#xff1a; 只能选择子节点 添加配置添加检索代码 源码&#xff1a; <template><div><el-button size"small" type"primary" clearable :disabled"disabled" click"showSign">危险点评估</el-button>…