Как извлечь угол поворота из QTransform? - PullRequest
6 голосов
/ 21 мая 2009

У меня есть объект QTransform, и я хотел бы знать угол в градусах, на который поворачивается объект, однако нет четкого примера того, как это сделать:

http://doc.trolltech.com/4.4/qtransform.html#basic-matrix-operations

Настроить это легко, вернуть его обратно сложно.

Ответы [ 5 ]

8 голосов
/ 21 мая 2009

Предполагая, что преобразование ONLY содержит вращение, это просто: достаточно взять acos элемента m11.

Это все еще работает, если преобразование содержит перевод, но если оно содержит сдвиг или масштабирование, вам не повезло. Их можно восстановить, разложив матрицу на матрицу сдвига, масштабирования и поворота, но результаты, которые вы получите, скорее всего, не те, что вы ищете.

8 голосов
/ 21 мая 2009

Самый простой общий способ - преобразовать (0,0) и (1,0), а затем использовать тригонометрические функции (арктан), чтобы получить угол

4 голосов
/ 21 мая 2009

Матрица преобразования - это реализация, используемая для трехмерной графики. Это упрощает математику для ускорения трехмерной позиционной / вращательной ориентации точек / объектов. Действительно, очень трудно вытащить ориентацию из Трансформации из-за того, как она накапливает последовательные переводы / вращения / масштабы.

Вот предложение. Возьмите вектор, который указывает в простом направлении, например (1,0,0), и примените к нему Преобразование. Ваш результирующий вектор будет переведен и повернут, чтобы дать вам что-то вроде этого: (27.8, 19.2, 77.4). Примените Преобразование к (0,0,0), чтобы получить что-то вроде (26.1, 19.4, 50.8). Вы можете использовать эти две точки для вычисления примененных поворотов, основываясь на знании их начальных точек (1,0,0).

Помогает ли это?

2 голосов
/ 21 мая 2009

Как правило, вам нужна обратная функция триггера, но вы должны следить за двусмысленностью квадрантов, и это то, что вы должны использовать atan2 (иногда пишется как arctan2). Так что либо поверните единичный вектор [0, 1] в [x, y], а затем используйте atan2 (y, x), либо, если матрица осуществляет только вращение, вы можете использовать atan2 (m12, m11). (Это похоже на ответы Хавьера и Нильса, за исключением того, что они не используют atan2.)

1 голос
/ 17 марта 2017

Я использовал QGraphicsItem только с setRotate, и у меня не было никаких проблем, пока я не добавил функциональность rotate group. Проблема в том, что при вызове destroyItemGroup вращение применяется как преобразование к элементам, а не как вращение. Из-за этого мне пришлось восстановить вращение из этого объекта QTransform.

Мое исправление состояло в том, чтобы добавить следующие строки в метод itemChange (кредит к ответу tom10):

QVariant MyGraphicItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
    if(change == ItemTransformChange)
    {
        auto transform = value.value<QTransform>();
        setRotation(rotation() + qRadiansToDegrees(qAtan2(transform.m12(), transform.m11())));
        return QVariant();
    }
    ...
}

PS .: Другое решение с acos и m11 () не сработало. Сбой при определенных значениях, как объяснено в tom10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...