Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. About Qt drawLine Questions
Qt 6.11 is out! See what's new in the release blog

About Qt drawLine Questions

Scheduled Pinned Locked Moved Solved General and Desktop
7 Posts 2 Posters 2.6k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    DavidHu
    wrote on last edited by
    #1

    alt text

    I draw adjacent lines on Qt 5.5.1 , found it is very strange., please refer to the bmp, Line1 and Line2, Line3 used the userdefine function , Line4 is used drawLine.I want to know why Qt drawn adjacent line will be like this? I can make it as normal as Line1 and Line2, Line3?
    My function is as follows:

    drawLineDDA(painter,110, 120.0, 111, 200.0 );
        drawLineDDA(painter,111, 200.0, 112, 110.0 );
    
        drawLineBresenham(painter,114, 120.0, 115, 200.0 );
        drawLineBresenham(painter,115, 200.0, 116, 110.0 );
    
        drawLineMiddle(painter,118, 120.0, 119, 200.0 );
        drawLineMiddle(painter,119, 200.0, 120, 110.0 );
    
        painter.drawLine(122, 120.0, 123, 200.0);
        painter.drawLine(123, 200.0, 124, 110.0 );
    
    
    void Widget::drawLineDDA(QPainter &painter,int x0, int y0, int xEnd, int yEnd)
    {
        int dx=xEnd-x0,dy=yEnd-y0,steps,k;
        float xIncrement,yIncrement,x=x0,y=y0;
        if(fabs(dx)>=fabs(dy))  steps=fabs(dx);
        else  steps=fabs(dy);
        xIncrement=float(dx)/float(steps);
        yIncrement=float(dy)/float(steps);
        painter.drawPoint(round(x),round(y));
        for(k=0;k<steps;k++){
            x+=xIncrement;
            y+=yIncrement;
            painter.drawPoint(round(x),round(y));
        }
    }
    
    void Widget::drawLineBresenham(QPainter &painter, int x1,int y1,int x2, int y2)
    {
        int dx = x2 - x1;
        int dy = y2 - y1;
        int ux = ((dx > 0) << 1) - 1;
        int uy = ((dy > 0) << 1) - 1;
        int x = x1, y = y1, eps;
    
        eps = 0;dx = abs(dx); dy = abs(dy);
        if (dx > dy)
        {
            for (x = x1; x != x2; x += ux)
            {
                painter.drawPoint(x,y);
                eps += dy;
                if ((eps << 1) >= dx)
                {
                    y += uy; eps -= dx;
                }
            }
        }
        else
        {
            for (y = y1; y != y2; y += uy)
            {
                painter.drawPoint(x,y);
                eps += dx;
                if ((eps << 1) >= dy)
                {
                    x += ux; eps -= dy;
                }
            }
        }
    }
    
    void Widget::drawLineMiddle(QPainter &painter, int x0, int y0, int x1, int y1)
    {
        int a,b,d1,d2,d,x,y;float m;
        if (x1<x0){d=x0,x0=x1,x1=d;d=y0,y0=y1,y1=d;}
        a=y0-y1,b=x1-x0;if (b==0) m=-1*a*100;
        else m=(float)a/(x0-x1);x=x0,y=y0;
        painter.drawPoint(x,y);
        if (m>=0 && m<=1)
        {d=2*a+b;d1=2*a,d2=2*(a+b);
         while (x<x1)
         {	if (d<=0)	{	x++,y++,d+=d2;}
            else	{	x++,d+=d1;	}
            painter.drawPoint(x,y);
         }}
        else if (m<=0 && m>=-1)
        {d=2*a-b;d1=2*a-2*b,d2=2*a;
         while (x<x1)
         {	if (d>0)	{	x++,y--,d+=d1;}
            else	{	x++,d+=d2;	}
            painter.drawPoint(x,y);
         }	}
        else if (m>1)
        {d=a+2*b;d1=2*(a+b),d2=2*b;
         while (y<y1)
         {	if (d>0)	{	x++,y++,d+=d1;}
            else	{	y++,d+=d2;	}
            painter.drawPoint(x,y);
         }	}
        else
        {d=a-2*b;d1=-2*b,d2=2*(a-b);
         while (y>y1)
         {	if (d<=0)	{	x++,y--,d+=d2;}
            else	{	y--,d+=d1;	}
            painter.drawPoint(x,y);
         }}
    }
    
    1 Reply Last reply
    0
    • D Offline
      D Offline
      DavidHu
      wrote on last edited by
      #2

      Anybody could help me to solve the problem?

      1 Reply Last reply
      0
      • SGaistS Offline
        SGaistS Offline
        SGaist
        Lifetime Qt Champion
        wrote on last edited by
        #3

        Hi and welcome to devnet,

        You should propose a minimal compile example showing your problem ?

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

        D 1 Reply Last reply
        0
        • D Offline
          D Offline
          DavidHu
          wrote on last edited by DavidHu
          #4

          1,Create a new project with Qt Widgets Application. Class name: Widget; Base Class: QWidget; Generate Form: not choose
          2,use the code in widget.cpp:

          #include "widget.h"
          #include<QPainter>
          #include<QtMath>
          #include <QLabel>
          
          
          Widget::Widget(QWidget *parent)
              : QWidget(parent)
          {
              setGeometry(200, 200, 600, 400);
              QLabel *label1 = new QLabel(this);
              label1->setText("drawLineDDA\nLine1");
              label1->move(100,10);
              QLabel *label2 = new QLabel(this);
              label2->setText("drawLineBresenham\nLine2");
              label2->move(220,10);
              QLabel *label3 = new QLabel(this);
              label3->setText("drawLineMiddle\nLine3");
              label3->move(340,10);
              QLabel *label4 = new QLabel(this);
              label4->setText("Qt drawLine\nLine4");
              label4->move(460,10);
          }
          
          Widget::~Widget()
          {
          
          }
          
          void Widget::paintEvent(QPaintEvent *)
          {
              QPainter painter(this);
              drawLineDDA(painter,110, 60.0, 111, 120.0 );
              drawLineDDA(painter,111, 120.0, 112, 50.0 );
          
              drawLineBresenham(painter,220, 60.0, 221, 120.0 );
              drawLineBresenham(painter,221, 120.0, 222, 50.0 );
          
              drawLineMiddle(painter,340, 60.0, 341, 120.0 );
              drawLineMiddle(painter,341, 120.0, 342, 50.0 );
          
              painter.drawLine(460, 60.0, 461, 120.0);
              painter.drawLine(461, 120.0, 462, 50.0 );
          }
          
          void Widget::drawLineDDA(QPainter &painter,int x0, int y0, int xEnd, int yEnd)
          {
              int dx=xEnd-x0,dy=yEnd-y0,steps,k;
              float xIncrement,yIncrement,x=x0,y=y0;
              if(fabs(dx)>=fabs(dy))  steps=fabs(dx);
              else  steps=fabs(dy);
              xIncrement=float(dx)/float(steps);
              yIncrement=float(dy)/float(steps);
              painter.drawPoint(round(x),round(y));
              for(k=0;k<steps;k++){
                  x+=xIncrement;
                  y+=yIncrement;
                  painter.drawPoint(round(x),round(y));
              }
          }
          
          void Widget::drawLineBresenham(QPainter &painter, int x1,int y1,int x2, int y2)
          {
              int dx = x2 - x1;
              int dy = y2 - y1;
              int ux = ((dx > 0) << 1) - 1;
              int uy = ((dy > 0) << 1) - 1;
              int x = x1, y = y1, eps;
          
              eps = 0;dx = abs(dx); dy = abs(dy);
              if (dx > dy)
              {
                  for (x = x1; x != x2; x += ux)
                  {
                      painter.drawPoint(x,y);
                      eps += dy;
                      if ((eps << 1) >= dx)
                      {
                          y += uy; eps -= dx;
                      }
                  }
              }
              else
              {
                  for (y = y1; y != y2; y += uy)
                  {
                      painter.drawPoint(x,y);
                      eps += dx;
                      if ((eps << 1) >= dy)
                      {
                          x += ux; eps -= dy;
                      }
                  }
              }
          }
          
          void Widget::drawLineMiddle(QPainter &painter, int x0, int y0, int x1, int y1)
          {
              int a,b,d1,d2,d,x,y;float m;
              if (x1<x0){d=x0,x0=x1,x1=d;d=y0,y0=y1,y1=d;}
              a=y0-y1,b=x1-x0;if (b==0) m=-1*a*100;
              else m=(float)a/(x0-x1);x=x0,y=y0;
              painter.drawPoint(x,y);
              if (m>=0 && m<=1)
              {d=2*a+b;d1=2*a,d2=2*(a+b);
               while (x<x1)
               {	if (d<=0)	{	x++,y++,d+=d2;}
                  else	{	x++,d+=d1;	}
                  painter.drawPoint(x,y);
               }}
              else if (m<=0 && m>=-1)
              {d=2*a-b;d1=2*a-2*b,d2=2*a;
               while (x<x1)
               {	if (d>0)	{	x++,y--,d+=d1;}
                  else	{	x++,d+=d2;	}
                  painter.drawPoint(x,y);
               }	}
              else if (m>1)
              {d=a+2*b;d1=2*(a+b),d2=2*b;
               while (y<y1)
               {	if (d>0)	{	x++,y++,d+=d1;}
                  else	{	y++,d+=d2;	}
                  painter.drawPoint(x,y);
               }	}
              else
              {d=a-2*b;d1=-2*b,d2=2*(a-b);
               while (y>y1)
               {	if (d<=0)	{	x++,y--,d+=d2;}
                  else	{	y--,d+=d1;	}
                  painter.drawPoint(x,y);
               }}
          }
          

          3, widget.h

          #ifndef WIDGET_H
          #define WIDGET_H
          
          #include <QWidget>
          
          class Widget : public QWidget
          {
              Q_OBJECT
          
              void drawLineDDA(QPainter &painter, int x0, int y0, int xEnd, int yEnd);
              void drawLineBresenham(QPainter &painter, int x1, int y1, int x2, int y2);
              void drawLineMiddle(QPainter &painter, int x0, int y0, int x1, int y1);
          public:
              Widget(QWidget *parent = 0);
              ~Widget();
          
          protected:
              void paintEvent(QPaintEvent *);
          };
          
          #endif // WIDGET_H
          
          1 Reply Last reply
          0
          • SGaistS SGaist

            Hi and welcome to devnet,

            You should propose a minimal compile example showing your problem ?

            D Offline
            D Offline
            DavidHu
            wrote on last edited by
            #5

            @SGaist Can you help me?

            1 Reply Last reply
            0
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on last edited by
              #6

              Add painter.setRenderHint(QPainter::Qt4CompatiblePainting); before your call to drawLine.

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              D 1 Reply Last reply
              2
              • SGaistS SGaist

                Add painter.setRenderHint(QPainter::Qt4CompatiblePainting); before your call to drawLine.

                D Offline
                D Offline
                DavidHu
                wrote on last edited by
                #7

                @SGaist Thank you very much.

                1 Reply Last reply
                1

                • Login

                • Login or register to search.
                • First post
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • Users
                • Groups
                • Search
                • Get Qt Extensions
                • Unsolved