Вращение. Рисование в 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.
Добавить комментарий