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