python - 如何计算QPolygon面积

标签 python geometry pyqt5 intersection qpolygon

我正在尝试获取蓝色和绿色 QPolygons 的交集,以及它占蓝色 QPolygon 的百分比(见下图)。

enter image description here

我创建的多边形如下:

import PyQt5
from PyQt5 import QtWidgets,QtGui,QtCore

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

import sys, math


class MyWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.pen1 = QtGui.QPen(QtGui.QColor(20,0,250))                      # set lineColor
        self.pen = QtGui.QPen(QtGui.QColor(0,0,0))                      # set lineColor
        self.pen2 = QtGui.QPen(QtGui.QColor(0,250,0))                      # set lineColor

        self.pen.setWidth(3)                                            # set lineWidth
        self.brush = QtGui.QBrush(QtGui.QColor(255,255,255,10))        # set fillColor
        
        coords = [PyQt5.QtCore.QPointF(640.0, 334.0), PyQt5.QtCore.QPointF(626.0, 462.0), PyQt5.QtCore.QPointF(782.0, 509.0), PyQt5.QtCore.QPointF(807.0, 373.0), PyQt5.QtCore.QPointF(807.0, 333.0)]
        greenpolygoncoords = [PyQt5.QtCore.QPointF(698.0, 373.0), PyQt5.QtCore.QPointF(690.0, 433.0), PyQt5.QtCore.QPointF(757.0, 376.0), PyQt5.QtCore.QPointF(713.0, 351.0), PyQt5.QtCore.QPointF(713.0, 351.0), PyQt5.QtCore.QPointF(698.0, 373.0)]
        self.bluepolygon = QPolygonF(coords)
        self.greenpolygon =QPolygonF(greenpolygoncoords)
        self.intersection = self.bluepolygon.intersected(self.greenpolygon)


        print("overlap = "+str(self.intersection.size()/self.bluepolygon.size()))


    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.setPen(self.pen1)
        painter.setBrush(self.brush)
        painter.drawPolygon(self.bluepolygon) #bluepolygon = Blue
        painter.setPen(self.pen)
        painter.drawPolygon(self.intersection) #Intersection = black
        painter.setPen(self.pen2)
        painter.drawPolygon(self.greenpolygon) # greenpolygon = Green
app = QtWidgets.QApplication(sys.argv)

widget = MyWidget()
widget.show()

sys.exit(app.exec_())

但是,当我尝试计算两个多边形之间的重叠时,作为蓝色多边形的百分比,我得到了一个错误的答案(它说重叠等于 1,但是,绿色多边形肯定不会向上 100% 的蓝色多边形)。

overlap = self.intersection.size()/self.bluepolygon.size()

当查看由 QPolygon.size() 计算的大小时,很明显 QPolygon.size() 返回了不正确的多边形大小。

    print("size of blue polygon = "+str(self.bluepolygon.size()))
    print("size of greenpolygon = "+str(self.greenpolygon.size()))
    print("size of intersection = "+str(self.intersection.size()))

返回:

size of blue polygon = 5
size of greenpolygon = 6
size of intersection = 5

显然由于 PyQt5 的某些原因,蓝色多边形小于绿色多边形。怎么会?

我做错了什么?

最佳答案

size() 方法不返回多边形的面积,而是返回边数或顶点数。如果你想计算面积,那么你必须使用 the standard method 来实现它。 :

def calculate_area(qpolygon):
    area = 0
    for i in range(qpolygon.size()):
        p1 = qpolygon[i]
        p2 = qpolygon[(i + 1) % qpolygon.size()]
        d = p1.x() * p2.y() - p2.x() * p1.y()
        area += d
    return abs(area) / 2

然后你评估你想要什么:

print(
    "overlap = "
    + str(calculate_area(self.intersection) / calculate_area(self.bluepolygon))
)

输出:

overlap = 0.0962288941619438

关于python - 如何计算QPolygon面积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67558984/

相关文章:

qt5 - PyQt5 - 缩放 qgraphicsitem

python - 递归函数不起作用

python - 为什么我的 CSS 选择器不能与 beautifulsoup 一起使用,但可以作为 chrome 控制台查询正常工作?

python - 以编程方式登录亚马逊

algorithm - 寻找适合一系列矩形的最大矩形的面积

python - 三角形顶点处的切圆

ios - 在 iOS 中围绕一个图钉添加多个圆圈

python - QCoreApplication.processEvents 行为

class - 将python类拆分为多个文件

python - lambda 的惊人结果