Qt 5.5, как повернуть многоугольник вокруг позиции

У меня есть полигон:

    QPolygon plyNeedle;
    plyNeedle << QPoint(ptOrigin.x() - intNeedleHalfWidth, ptOrigin.y())
              << QPoint(ptOrigin.x(), ptOrigin.y() + intNeedleHalfWidth)
              << QPoint(ptOrigin.x() + intRadius - intNeedleHalfWidth, ptOrigin.y())
              << QPoint(ptOrigin.x(), ptOrigin.y() - intNeedleHalfWidth);

ptOrigin имеет тип QPoint и определяет точку поворота. intNeedleHalfWidth является целым числом и имеет значение 4. intRadius является целым числом и определяет длину иглы.

Я хочу повернуть полигон вокруг второго индекса полигона, но как?

(Редактировать)... При попытке Ответ, предложенный Антоном Савиным, до и преобразование:

    ptOrigin (40, 250)
    plyNeedle (36,250),(40,254),(287,250),(40,246)

После выполнения:

    plyNeedle = QTransform().translate(-ptOrigin.x(), -ptOrigin.y())
                            .rotate(45)
                            .translate(ptOrigin.x(), ptOrigin.y())
                            .map(plyNeedle);

Затем plyNeedle добавляется в QPainter:

    QBrush brshArrow;
    brshArrow.setColor(mcpszARGBneedle);
    brshArrow.setStyle(Qt::SolidPattern);
    objOffscrPainter.setPen(mcpszARGBneedle);
    QPainterPath path;
    path.addPolygon(plyNeedle);
    objOffscrPainter.drawPolygon(plyNeedle);
    objOffscrPainter.fillPath(path, brshArrow);

Ничего не отображается, при исследовании plyNeedle содержит:

    plyNeedle (-340,157),(-340,163),(-162,335),(-334,157)

person SPlatten    schedule 22.03.2016    source источник


Ответы (2)


Что-то вроде этого:

QPoint origin = ...;
plyNeedle = QTransform()
   .translate(-origin.x, -origin.y)
   .rotate(angle)
   .translate(origin.x, origin.y)
   .map(plyNeedle);
person Anton Savin    schedule 22.03.2016
comment
Не уверен, что произошло, но стрелка полностью исчезла, при проверке с помощью отладчика я вижу, что координаты X сильно отрицательны... Я отредактирую исходный пост, чтобы включить результаты. - person SPlatten; 22.03.2016

Спасибо «Антону Савину», который навел меня на правильный путь, после некоторой игры фактическим решением было:

    plyNeedle << QPoint(ptOrigin.x() - intNeedleHalfWidth, ptOrigin.y())
              << QPoint(ptOrigin.x(), ptOrigin.y() + intNeedleHalfWidth)
              << QPoint(ptOrigin.x() + intRadius - intNeedleHalfWidth, ptOrigin.y())
              << QPoint(ptOrigin.x(), ptOrigin.y() - intNeedleHalfWidth);
    plyNeedle = QTransform().translate(ptOrigin.x(), ptOrigin.y())
                            .rotate(-mfltElevation)
                            .translate(-ptOrigin.x(), -ptOrigin.y())
                            .map(plyNeedle);

Теперь это работает отлично.

введите здесь описание изображения

person SPlatten    schedule 22.03.2016