0

我一直在尝试使用 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);

在某个时间点,当我想知道点的位置时,我使用:

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

这给我 33 分而不是 18 分。

有没有办法从路径()获取我开始的那 18 个点的当前位置?

编辑1:比较toFillPolygon()开放多边形(起点和终点不同)和封闭多边形的结果后,我意识到开放多边形(如我的情况)toFillPolygon()将不起作用或返回错误值。

4

1 回答 1

0

在意识到我无法从中获得积分后,toFillPolygon()我偶然发现了这个链接。它帮助我理解当我们的路径本身是 OPEN POLYGON 时,我们无法从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 个点的当前位置。

于 2020-07-11T08:48:40.820 回答