В Qt метод drawPoint ничего не отображает, если поставляются отрицательные параметры

В Qt creator метод drawPoint() не ставит точку, если передаются отрицательные значения, следующий код для алгоритма Брезенхэма. Но он не работает в qt creator.it, просто строит окружность в одном квадранте.

Bresenham::Bresenham(QWidget*parent):QWidget(parent)  
{}

void  Bresenham::paintEvent(QPaintEvent *e)  
{  
     Q_UNUSED(e);  
     QPainter qp(this);  
     drawPixel(&qp);  
}  
void  Bresenham::drawPixel(QPainter *qp)  
{  
    QPen pen(Qt::red,2,Qt::SolidLine);  
    qp->setPen(pen);  
    int x=0,y,d,r=100;  
    y=r;  
    d=3-2*r;  
    do  
    {  
       qp->drawPoint(x,y);  
       qp->drawPoint(y,x);  
       qp->drawPoint(y,-x);  
       qp->drawPoint(x,-y);  
       qp->drawPoint(-x,-y);  
       qp->drawPoint(-y,-x);  
       qp->drawPoint(-x,y);  
       qp->drawPoint(-y,x);
       if(d<0)  
       {  
          d=d+4*x+6;  
       }  
       else  
       {  
          d=d+(4*x-4*y)+10;  
          y=y-1;  
       }  
       x=x+1;  
      }while(x<y); 
}

1 ответ

Решение

Вам нужно перевести систему координат Qt в классическую декартову систему. Выберите новый центр QPoint orig и заменить все

qp->drawPoint(x,y);  

с

qp->drawPoint(orig + QPoint(x,y));

Источник системы координат Qt находится в (0,0) и ось Y инвертирована. Например, сегмент из A(2,7) в B(6,1) выглядеть так:

Обратите внимание, что существует только положительный-x, положительный-y квадрант. Для простоты предположим, что отрицательных координат не существует.

Замечания:

Из соображений производительности лучше сначала вычислить все точки, а затем нарисовать их все, используя

QPainter::drawPoints ( const QPoint * points, int pointCount );
Другие вопросы по тегам