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: 3
end 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? true
is 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:
true
true
至此,QLine类的方法就说完了,QLineF大部分方法与QLine是一致的。