QPainterPath toFillPolygon () возвращает больше точек, чем точек, используемых для рисования самого пути - PullRequest
0 голосов
/ 10 июля 2020

Я пытался нарисовать точки скелета человека, используя 18 различных суставов. Итак, я решил использовать QGraphicsPathItem. Я мог успешно создать предмет, который выглядит примерно так: (простите за мои навыки рисования)

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

Для этого я использовал:

QPainterPath pp;

pp.moveTo(m_points[0]); 
pp.lineTo(m_points[1]); 
pp.lineTo(m_points[2]); 
pp.lineTo(m_points[3]); 
pp.lineTo(m_points[4]); 

pp.moveTo(m_points[1]); 
pp.lineTo(m_points[5]); 
pp.lineTo(m_points[6]); 
pp.lineTo(m_points[7]); 

pp.moveTo(m_points[1]); 
pp.lineTo(m_points[8]); 
pp.lineTo(m_points[9]); 
pp.lineTo(m_points[10]);

pp.moveTo(m_points[1]); 
pp.lineTo(m_points[11]);
pp.lineTo(m_points[12]);
pp.lineTo(m_points[13]);

pp.moveTo(m_points[0]); 
pp.lineTo(m_points[14]);
pp.lineTo(m_points[16]);

pp.moveTo(m_points[0]); 
pp.lineTo(m_points[15]);
pp.lineTo(m_points[17]);

m_item->setPath(pp);

В какой-то момент времени, когда я буду sh узнать положение точек, я использую:

QPolygonF polygon = m_item->path().toFillPolygon();

это возвращает мне 33 очка вместо 18.

Есть ли способ узнать текущие позиции тех 18 очков, с которых я начал, из path ()?

РЕДАКТИРОВАТЬ 1: После сравнения результатов toFillPolygon() для открытого многоугольника (начальная и конечная точки разные) и закрытого многоугольника, я понял, что в открытом многоугольнике (как в моем случае) toFillPolygon() не будет работать или возвращает неверные значения.

1 Ответ

0 голосов
/ 11 июля 2020

Поняв, что не могу получить очки от toFillPolygon(), я наткнулся на эту ссылку . Это помогло мне понять, что мы не можем извлекать точки из QPainterPath с помощью toFillPolygon(), когда наш путь сам по себе ОТКРЫТЫЙ ПОЛИГОН, т.е. начальная и конечная точки разные. Итак, я использовал что-то вроде этого:

    QVector<QPointF> pointsTable;
    QPainterPath path = m_item->path();

    pointsTable.reserve(18);

    // push the point 0 manually
    // since it is created using moveTo()
    // but we need this starting point
    pointsTable.push_back(mapToScene(path.elementAt(0)));

    // iterate through all the elements of the path
    for (int idx = 0; idx < path.elementCount(); ++idx)
    {
        // DO NOT consider moveTo() elements
        // we only need lineTo() elements
        if (!path.elementAt(idx).isMoveTo())
        {
            // push into the container
            pointsTable.push_back(mapToScene(path.elementAt(idx)));
        }
    }

Обратите внимание, я не рассматриваю элементы moveTo(), а только элементы lineTo(), за исключением первого элемента moveTo(), который является моей начальной позицией.

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

...