Пятница, 02.10.2020 08:00

Вращение. Рисование в Qt. Трансформации. Часть 2

Вращение. Рисование в Qt. Трансформации. Часть 2

В предыдущей части мы рассмотрели трансформацию примитивов с помощью трансляции. Сегодня мы рассмотрим новый тип трансформации – вращение.

Мы продолжим работать с проектом с прошлой части, его исходники вы можете найти на GitFlic.

Для начала, обеспечим себя чистым рабочим столом.

В методе 

void MainWindow::paintEvent(QPaintEvent *) 

закомментируем 

drawChildPicRel(); 

и запустим - получим чистое окно.

Добавим метод для отрисовки солнца.

void MainWindow::drawSun()
{
    QColor linesColor(0, 0, 255, 255);
    QPen apen = QPen(linesColor);
    apen.setWidth(3);
    painter->setPen(apen);

    painter->translate(QPoint(150-25,150-25));

    //Элипс - круг - солнце
    apen = QPen(QColor("yellow"));
    apen.setWidth(2);
    painter->setPen(apen);
    painter->setBrush(Qt::yellow);
    painter->drawEllipse(0, 0, 50,50);
}

Добавим вызов drawSun(); в void MainWindow::drawSun()

Запустим

Изображение удалено.

Обратите внимание на строчку 

painter->translate(QPoint(150-25,150-25));

Для наглядности, я вычел 25, чтобы расположить солнце по центру.

Для большей наглядности, давайте добавим метод, который будет отрисовывать координатную ось из текущего начала координат. 

void MainWindow::drawCoordAxis(int length)
{
    QColor coordLineColor(255, 0, 0, 255);

    QPen apen = QPen(coordLineColor);
    apen.setWidth(5);
    painter->setPen(apen);

    painter->drawLine(QLine(0,0,length,0));
    painter->drawLine(QLine(0,0,0,length));   
}

Добавим вызов  drawCoordAxis(100); в void MainWindow::drawSun() после painter->translate(QPoint(150-25,150-25));

Запустим:

Изображение удалено.

Круг перекрывает оси, но в данном случае это нормально из за толщины линий.

Как видите, рисование солнца начинается от левого верхнего угла.

Далее мы нарисуем нашему солнцу лучи, как их рисуют дети.

     painter->translate(QPoint(25,0));

    apen.setWidth(4);
    painter->setPen(apen);
    painter->setBrush(Qt::yellow);
    painter->drawLine(QLine(0,0,0,-25));

    painter->translate(QPoint(25,25));

    apen.setWidth(4);
    painter->setPen(apen);
    painter->setBrush(Qt::yellow);
    painter->drawLine(QLine(0,0,25,0));

    painter->translate(QPoint(-25,25));

    apen.setWidth(4);
    painter->setPen(apen);
    painter->setBrush(Qt::yellow);
    painter->drawLine(QLine(0,0,0,25));

    painter->translate(QPoint(-25,-25));

    apen.setWidth(4);
    painter->setPen(apen);
    painter->setBrush(Qt::yellow);
    painter->drawLine(QLine(0,0,-25,0));

Изображение удалено.

Тут у нас сразу возникает проблема, мы, конечно, можем рассчитать координаты и нарисовать лучи вручную. Но это будет неэффективно. Если, к примеру, нам потребуется увеличить количество лучей, координаты придется пересчитывать.

Вот здесь нам и поможет новый тип трансформации – вращение.

Добавим в конец метода void MainWindow::drawSun()следующий код

    painter->translate(QPoint(25,25));

    apen = QPen(QColor("magenta"));
    apen.setWidth(4);
    painter->setPen(apen);
    painter->drawLine(QLine(0,0,0,-75));

    painter->rotate(45);
    painter->drawLine(QLine(0,0,0,-75));

    painter->rotate(45);
    painter->drawLine(QLine(0,0,0,-75));

    painter->rotate(45);
    painter->drawLine(QLine(0,0,0,-75));

Для наглядности, я буду использовать контрастный цвет для лучей.

У нас получилось:

Изображение удалено.

Вращая каждый раз на 45 градусов, мы получили несколько лучей.

Давайте приведем этот код к более оптимальному виду и поменяем цвет на желтый.

В результате метод void MainWindow::drawSun()у нас примет вид

void MainWindow::drawSun()
{
    int beamLength = 70;
    QColor linesColor(0, 0, 255, 255);
    QPen apen = QPen(linesColor);
    apen.setWidth(3);
    painter->setPen(apen);

    painter->translate(QPoint(150-25,150-25));

    //Элипс - круг - солнце
    apen = QPen(QColor("yellow"));
    apen.setWidth(2);
    painter->setPen(apen);
    painter->setBrush(Qt::yellow);
    painter->drawEllipse(0, 0, 50,50);

    //рисуем лучи
    painter->translate(QPoint(25,25));

    apen.setWidth(4);
    painter->setPen(apen);
    painter->drawLine(QLine(0,0,0,beamLength*-1));

    for (int i = 0; i < 7; i++) {
        painter->rotate(45);
        painter->drawLine(QLine(0,0,0,beamLength*-1));
    }
}

У нас получилось:

Изображение удалено.

Уберем строчку

    painter->translate(QPoint(150-25,150-25));

Уменьшим длину лучей

int beamLength = 40;

и добавим в 

drawChildPicRel()

вызов 

drawSun();

Используем метод 

drawChildPicRel() 

для рисования.

У нас получится:

Изображение удалено.

Заключение

Вот и всё на сегодня.

Мы рассмотрели еще один тип трансформации – вращение.

Мы добавили к нашему рисунку еще несколько деталей. На этот раз – лучи солнца.

В следующей части мы более подробно рассмотрим методы save и restore класса QPainter.

Скачать исходный код вы можете с GitFlic.

Категория Qt
Теги Qt Cpp

Добавить комментарий

Простой текст

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
Просмотров: 188