Comments 5
Не проще использовать QPainter::setTransform() вместо QPixmap::transformed(), чтобы не воевать с подобными проблемами?
Спасибо за совет.
Попробавал setTransform. В этом случае картинка svg вставляется без изменения масштаба. Однако появляется другая загвоздочка. Для правильного позиционирования центра изображения (вершины сектора) необходимо сместить центр вращения Qpainter.
Получился следующий код
int x0 = 150; // Специально изменил, чтобы показать влияние различных координат
int y0 = 50;
int w0 = 300;
QRect rect0(x0, y0, w0, w0);
QTransform t0;
qreal ugRot = 30.; // Угол поворота изменил (45 градусов как-то симметрично)
qreal sinUgRot = sin(ugRot * M_PI / 180.);
qreal cosUgRot = cos(ugRot * M_PI / 180.);
qreal rx = x0 + w0 / 2.;
qreal ry = y0 + w0 / 2.;
t0.translate(rx (1. - cosUgRot) + ry sinUgRot, - rx sinUgRot - ry (cosUgRot - 1.)); // Смещение центра поворота
t0.rotate(ugRot);
myPaiter.begin(Pm0);
myPaiter.drawPixmap(rect0, p0); // Исходный сектор
myPaiter.setTransform(t0);
myPaiter.drawPixmap(rect0, p0); // Сектор после поворота
myPaiter.end();
Получилась следующая картинка

Если центр поворота не смещать картинка будет такая

Ну точку вращения всегда нужно учитывать.
В этом случае, для меня проще следующий способ: т.к. преобразование поворота всегда поворачивает относительно точки (0, 0), чтобы выполнить поворот относительно точки (x, y), нам нужно выполнить преобразование, чтобы эта точка переместилась в точку (0, 0), повернуть, после чего выполнить преобразование, чтобы точка вернулась на свое место.
Т.е. итоговое преобразование рассчитывается так:
QTrasnform trot = ... // Преобразование поворота
QTransform tcenter = QTransform::fromTranslate(-x, -y);
QTransform t = tcenter * trot * tcenter.inverted();
how-do-i-rotate-photos-in-qpixmap
вся математика. я бы кинул математику на видео обзор, вобщем суть в том, что почти вся векторная математика имеет вид Т*R*S (translate,rotate,scale), если в 2д то просто в векторке так можно оставаться для 3д уже матрицы используем, по пайплайну 3д можно увидеть как работают трансформации, по ортогональному виду в 3д можно просмотреть логику работы векторки в 2д
(так же относительность будет работать, просто потомучто поворот всегда высчитывается в реале по углу левомуверхнему поидее, в момент поворота просто он будет происходить что в 3д что в 2д относительно точки как не крути)
Компенсация уменьшения размеров изображения при повороте и отображении с помощью функции QPainter drawPixmap