计算不规则四边形(多边形)的面积

本文代码用于比较计算不规则四边形的面积的两种方法(海伦公式和向量积),因为本人最近在研究目标检测的问题,当标记目标是以不规则四边形标注或多边形时,需要基于此面积计算Recall,Precision,IoU来评价模型。1. 海伦公式和向量积公式海伦公式和向量积计算不规则四边形的面积,都是以计算三角形面积为基础。海伦公式:(看代码)向量积:https://blog.csdn.net/l...
摘要由CSDN通过智能技术生成

本文代码用于比较计算不规则四边形的面积的两种方法(海伦公式和向量积),因为本人最近在研究目标检测的问题,当标记目标是以不规则四边形标注或多边形时,需要基于此面积计算Recall,Precision,IoU来评价模型。

1. 海伦公式和向量积公式

海伦公式和向量积计算不规则四边形的面积,都是以计算三角形面积为基础。

海伦公式:(看代码)

向量积:https://blog.csdn.net/liyuanbhu/article/details/51921096

2.  海伦公式和向量积对比

向量积计算多边形可基于行列式的方法,计算量小且快,而海伦公式因为要计算根号(根号内还得大于等于0),所以其计算量较大。当然最重要的是向量积计算的结果更精确。

3. 向量积判断顺逆时针标注的坐标

基于向量积计算面积的正负,可判断标注坐标是顺时针(负)还是逆时针(正)。

4. 本文代码计算的是不规则四边形,小小的修改可计算多边形。

import numpy as np

# 计算欧式距离
def cal_distance(point1, point2):
    dis = np.sqrt(np.sum(np.square(point1[0]-point2[0])+np.square(point1[1]-point2[1])))
    return dis

# 基于海伦公式计算不规则四边形的面积
def helen_formula(coord):
    coord = np.array(coord).reshape((4,2))
    # 计算各边的欧式距离
    dis_01 = cal_di
  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您好!要将一个不规则多边形根据纵坐标划分为若干个四边形,可以使用Qt的绘图功能来实现。以下是一个简单的函数实现示例: ```cpp #include <QPolygonF> #include <QPainter> void dividePolygon(const QPolygonF& polygon, qreal yDivide, QVector<QPolygonF>& dividedPolygons) { dividedPolygons.clear(); if (polygon.isEmpty()) return; // 找到多边形的最小和最大纵坐标值 qreal minY = polygon.first().y(); qreal maxY = minY; for (const QPointF& point : polygon) { if (point.y() < minY) minY = point.y(); if (point.y() > maxY) maxY = point.y(); } // 对于每个纵坐标划分点,将多边形划分为四边形 qreal y = minY; while (y < maxY) { QPolygonF dividedPolygon; for (int i = 0; i < polygon.size(); ++i) { const QPointF& p1 = polygon[i]; const QPointF& p2 = polygon[(i + 1) % polygon.size()]; if ((p1.y() <= y && p2.y() > y) || (p1.y() > y && p2.y() <= y)) { // 计算交点的横坐标 qreal x = p1.x() + ((y - p1.y()) / (p2.y() - p1.y())) * (p2.x() - p1.x()); // 添加交点到划分多边形 dividedPolygon.append(QPointF(x, y)); } } // 根据横坐标排序 std::sort(dividedPolygon.begin(), dividedPolygon.end(), [](const QPointF& p1, const QPointF& p2) { return p1.x() < p2.x(); }); dividedPolygons.append(dividedPolygon); // 下一个纵坐标划分点 y += yDivide; } } ``` 使用示例: ```cpp // 定义一个不规则多边形 QPolygonF polygon; polygon << QPointF(100, 100) << QPointF(200, 50) << QPointF(300, 150) << QPointF(250, 300) << QPointF(150, 250); // 划分多边形为若干个四边形 qreal yDivide = 50; // 设置纵坐标划分间隔 QVector<QPolygonF> dividedPolygons; dividePolygon(polygon, yDivide, dividedPolygons); ``` 这样,您就可以得到按纵坐标划分的若干个四边形的集合`dividedPolygons`。每个`QPolygonF`对象表示一个四边形,可以根据需要进行处理或绘制。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值