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

发布于:2024-12-06 ⋅ 阅读:(31) ⋅ 点赞:(0)

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是一致的。



网站公告

今日签到

点亮在社区的每一天
去签到