Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: lighting от Март 02, 2013, 17:21



Название: [Решено]Помогите разобраться с QTransform
Отправлено: lighting от Март 02, 2013, 17:21
Всю задачу описывать не буду, т.к. длинно и к проблеме непосредственного отношения не имеет. Сформулирую кратко задачу так:
Имеется холст заданного размера, на нем размещено изображение, о котором нам известны его начальные координаты, а также его модификаторы (угол поворота и масштаб). По этим данным нужно создать QImage и правильно заполнить его. Казалось-бы задача решается просто (скорее всего так оно и есть):
- создать QImage нужного размера
- залить его фоновым цветом
- в еще один QImage загрузить изображение
- создать QTransform
- вызвать translate, rotate, scale для этого QTransform
- трансформированное изображение нарисовать используя drawImage на первом QImage
- сохранить первый QImage в файл
Однако на практике появляются проблемы, при повороте/масштабировании размеры второго QImage меняются и происходит смещение при выводе на drawImage которое видно в прикрепленном изображении. На первой и третьей картинке показан желаемый результат, на второй и четвертой - то что получается. Чувствую что задача эта решается как-то просто, но вторую неделю не могу найти это простое решение.


Название: Re: Помогите разобраться с QTransform
Отправлено: ltise от Март 02, 2013, 17:29
В QTransform есть прикольные методы:
QTransform::quadToQuad(const QPolygonF &one,
                           const QPolygonF &two,
                           QTransform &result);
QTransform::quadToSquare(const QPolygonF &one,
                           const QPolygonF &two,
                           QTransform &result);

Просто указываешь исходный полигон и требуемый полигон - результатом является требуемая матрица.
Очень удобно.
В полигонах должно быть строго 4 точки


Название: Re: Помогите разобраться с QTransform
Отправлено: Igors от Март 02, 2013, 17:42
Проще всего поворачивать и масштабировать картинку относительно ее центра, т.е. сначала translate(w/2, -h/2). Тогда центры новой и старой картинок будут соответствовать одной и той же исходной точке  Остается только вписать новый в старый размер
Код
C++ (Qt)
int dx = (newImg.width() - oldImg.width()) / 2;
int dy = (newImg.height() - oldImg.height()) / 2;
oldImg = newImg.copy(dx, dy, oldImg.width(), oldImg.height());


Название: Re: Помогите разобраться с QTransform
Отправлено: lighting от Март 03, 2013, 10:21
Пока к сожалению нет возможности проверить, вечером доберусь до компа и попробую. Правда есть вопрос, не опечатка-ли зедсь:
сначала translate(w/2, -h/2).
Тут действительно надо -h/2? bили всетаки плюс?


Название: Re: Помогите разобраться с QTransform
Отправлено: Igors от Март 03, 2013, 11:08
Тут действительно надо -h/2? bили всетаки плюс?
Та может и плюс :) Обычно я об этом не задумываюсь - посмотрел, ага, не туда крутит, ну значит поменял минус на плюс.

Ну и вообще - есть простые операции на плоскости, QTransform всего лишь их реализует. Поэтому лучше подучить геометрию, а не классы  :)


Название: Re: Помогите разобраться с QTransform
Отправлено: lighting от Март 05, 2013, 10:07
Igors спасибо, помогло.