Search
Write a publication
Pull to refresh

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д относительно точки как не крути)

Sign up to leave a comment.

Articles