计算QPainterPath的填充区域

时间:2013-11-29 09:40:42

标签: qt qgraphicsitem

在qgraphicsItem中使用paint()函数中的QPainterPath我在场景上画了一个自由形式的图画。我想问一下是否有办法计算封闭画家路径的面积。我想将场景中所覆盖的画家路径区域显示为boundingRect。

4 个答案:

答案 0 :(得分:2)

要计算多边形的面积,可以通过两种方式进行:

缓慢但通用(可能存在精度问题):从pointAtPercent获取一些步骤并为此类多边形执行standard calculation

速度快但仅适用于QPainterPath哪些段为LineToElement。只需使用elementAt和elementCount遍历所有多边形角,然后再次执行standard calculation来计算多边形区域。

答案 1 :(得分:1)

我不完全确定这是否是您正在寻找的,但如果您只想填充封闭画家路径的区域,则有QPainter::fillPath函数:

void QPainter::fillPath ( const QPainterPath & path, const QBrush & brush )

答案 2 :(得分:1)

非自相交多边形的PyQt / PySide方法:

def frange(start, stop, step):
    '''Helper float generator'''
    while start < stop:
        yield start
        start += step

def painterPathArea(path, precision = 10000):
    '''QPainterPath area calculation'''
    points = [(point.x(), point.y()) for point in (path.pointAtPercent(perc) for perc in frange (0, 1, 1.0 / precision))]
    points.append(points[0])

    return 0.5 * abs(reduce(
        lambda sum, i: sum + (points[i][0] * points[i + 1][1] - points[i + 1][0] * points[i][1]),
        xrange (len (points) - 1),
        0
    ))

同样没有减少:

def painterPathArea(path, precision = 10000):
    '''QPainterPath area calculation'''
    points = [(point.x(), point.y()) for point in (path.pointAtPercent(perc) for perc in frange (0, 1, 1.0 / precision))]
    points.append(points[0])

    sum = 0
    for i in xrange (len (points) - 1):
        sum += points[i][0] * points[i + 1][1] - points[i + 1][0] * points[i][1]

    return abs(sum) / 2

实际上,精度只是近似多边形的顶点数。越多越好越好。

答案 3 :(得分:1)

qreal getPathArea(QPainterPath *p, qreal step)
{
    QPointF a,b;
    qreal len;
    qreal area=0;
    for(len=0; len<p->length(); len+=step)
    {
        a=p->pointAtPercent(p->percentAtLength(len));
        b=p->pointAtPercent(p->percentAtLength(len+step>p->length()?p->length():len+step));
        area+=(b.x()-a.x())*(a.y+b.y);
    }
    return area/qreal(2);
}