Вращение. Рисование в Qt5 - трансформации. Часть 2 - АлтунинВВ.Блог - всё об IT-технологиях!
Пятница, 02 октября 2020 19:00

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

Россия

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

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

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

В методе 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()

Запустим

2020-09-30_16-35-48.png

Обратите внимание на строчку 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));

Запустим:

2020-09-30_16-43-19.png

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

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

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

    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));

2020-09-30_17-07-17.png

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

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

Добавим в конец метода 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));

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

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

2020-09-30_17-21-16.png

Вращая каждый раз на 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));
    }
}

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

2020-09-30_17-25-13.png

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

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

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

int beamLength = 40;

и добавим в drawChildPicRel()вызов drawSun();

Используем метод drawChildPicRel() для рисования.

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

2020-09-30_17-30-48.png

Заключение

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

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

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

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

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

Прочитано 129 раз Последнее изменение Пятница, 02 октября 2020 10:40