Что не так с этой попыткой рендеринга вращающихся эллипсов в Qt?

1. Цель

Мой коллега и я пытались визуализировать вращающиеся эллипсоиды в Qt. Типичный подход к решению, как мы его понимаем, состоит в смещении центра эллипсоидов в начало системы координат, выполнении вращения там и смещении назад:
http://qt-project.org/doc/qt-4.8/qml-rotation.html

2. Пример кода

Основываясь на решении, указанном в ссылке выше, мы создали следующий пример кода:

// Constructs and destructors
RIEllipse(QRect rect, RIShape* parent, bool isFilled = false)
: RIShape(parent, isFilled), _rect(rect), _angle(30)
{}

// Main functionality
virtual Status draw(QPainter& painter)
{
const QPen& prevPen = painter.pen();
painter.setPen(getContColor());
const QBrush& prevBrush = painter.brush();
painter.setBrush(getFillBrush(Qt::SolidPattern));

// Get rectangle center
QPoint center = _rect.center();

// Center the ellipse at the origin (0,0)
painter.translate(-center.x(), -center.y());
// Rotate the ellipse around its center
painter.rotate(_angle);
// Move the rotated ellipse back to its initial location
painter.translate(center.x(), center.y());

// Draw the ellipse rotated around its center
painter.drawEllipse(_rect);

painter.setBrush(prevBrush);
painter.setPen(prevPen);
return IL_SUCCESS;
}

Как видите, в этом тестовом образце мы жестко закодировали угол поворота до 30 градусов.

3. Наблюдения

Эллипсы выходят в неправильных положениях, часто за пределами области холста.

4. Вопрос

Что не так в приведенном выше примере кода?

С наилучшими пожеланиями,

Baldur

Постскриптум Заранее спасибо за любой конструктивный ответ?

P.P.S. Прежде чем опубликовать это сообщение, мы довольно много раз искали на stackoverflow.com.
Перемещение / вращение изображения Qt казалось, отражает подход решения, подобный ссылке выше.

4

Решение

В painter.translate(center.x(), center.y()); вы сдвигаете свой объект на величину текущей координаты, которая составляет (2*center.x(), 2*center.y()) в следствии. Вам может понадобиться:

painter.translate(- center.x(), - center.y());
0

Другие решения

Теория перемещения объекта обратно к его началу, вращения и затем замены положения объекта верна. Однако код, который вы представили, вовсе не переводит и не вращает объект, а переводит и вращает художника. В примере вопроса, который вы упоминается, они хотят повернуть все изображение объекта, поэтому перед поворотом они перемещают художника в центр объекта.

Самый простой способ поворота объекта GraphicsItem состоит в том, чтобы изначально определить элемент с центром в центре объекта, а не в его верхнем левом углу. Таким образом, любое вращение будет автоматически происходить вокруг центра объекта, без необходимости перемещать объект.

Чтобы сделать это, вы должны определить элемент с ограничительным прямоугольником для x, y, width, height с помощью (-width / 2, -height / 2, width, height).

В качестве альтернативы, если ваш элемент унаследован от QGraphicsItem или QGraphicsObject, вы можете использовать функцию setTransformOriginPoint перед любым поворотом.

0

По вопросам рекламы [email protected]