以凸包的某条边作为矩形的一条边,求包围所有点的面积最小外接矩形。(感觉是对的)下图中蓝色为凸包,红色为MBR。

           

分享给有需要的人,代码质量勿喷。

一、求凸包,返回 xjListCH

参考:凸包

二、MBR中用到的函数

//返回 点与点的平面距离
double TwoDistancePointAndPoint(const xjPoint &p1, const xjPoint &p2)
{double x1 = p1.x, y1 = p1.y;double x2 = p2.x, y2 = p2.y;double dis = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));return dis;
}//返回 点(p0)  到线(p1,p2)的距离
double TwoDistancePointAndLine(const xjPoint &p0, const xjPoint &p1,const xjPoint &p2)
{double dis12 = TwoDistancePointAndPoint(p1, p2);//线段长度double dis01 = TwoDistancePointAndPoint(p0, p1);//p1与p0的距离double dis02 = TwoDistancePointAndPoint(p0, p2);//p2与p0的距离double HalfC = (dis12 + dis01 + dis02) / 2;// 半周长double s = sqrt(HalfC * (HalfC - dis12) * (HalfC - dis01) * (HalfC - dis02));//海伦公式求面积double xj2DisPL = 2 * s / dis12;// 返回点到线的距离(利用三角形面积公式求高)return xj2DisPL;
}

三、最小外接矩形

/*返回 最小外接矩形点*/
/* xjListCH 凸包点 */
void xjMinimumBoundingRectangle(QList<xjPoint> &xjListMBRpoint, double &length, double &width, QList<xjPoint> xjListCH)
{//外接矩形QList<xjPoint> xjListCH2;int xjPcount = xjListCH.size();for (int i = 0; i < xjPcount; i++){xjListCH2.append(xjListCH.at(i));}qSort(xjListCH2.begin(), xjListCH2.end(), [](const xjPoint &a, const xjPoint &b) {return a.x < b.x; });double minX = xjListCH2.at(0).x;double maxX = xjListCH2.at(xjPcount - 1).x;qSort(xjListCH2.begin(), xjListCH2.end(), [](const xjPoint &a, const xjPoint &b) {return a.y < b.y; });double minY = xjListCH2.at(0).y;double maxY = xjListCH2.at(xjPcount - 1).y;//依次判断double minArea = 99999999;xjListCH.push_back(xjListCH.at(0));for (int a = 0; a < xjListCH.size() - 1; a++){xjPoint p0 = xjListCH.at(a);xjPoint p1 = xjListCH.at(a + 1);if ((p0.y == p1.y)|| (p0.x == p1.x)) // 水平或垂直{double side1 = maxY - minY;double side0 = maxX - minX;double xjArea = side0 * side1;if (xjArea <= minArea){length = max(side0, side1);width = min(side0, side1);minArea = xjArea;//外接矩形四个点xjPoint pLB;pLB.x = minX;pLB.y = minY;pLB.z = 0;xjPoint pRB;pRB.x = maxX;pRB.y = minY;pRB.z = 0;xjPoint pRT;pRT.x = maxX;pRT.y = maxY;pRT.z = 0;xjPoint pLT;pLT.x = minX;pLT.y = maxY;pLT.z = 0;xjListMBRpoint.clear();xjListMBRpoint.append(pLB);xjListMBRpoint.append(pRB);xjListMBRpoint.append(pRT);xjListMBRpoint.append(pLT);}}else //不水平 不垂直{double k1 = (p1.y - p0.y) / (p1.x - p0.x);double b1 = p0.y - k1 * p0.x;double side0 = -3;xjPoint Pside0;for (int j = 0; j < xjListCH.size(); j++){if ((j == a) || (j == (a + 1)))continue;xjPoint p = xjListCH.at(j);double dis = abs(TwoDistancePointAndLine(p, p0, p1));if (dis >= side0){side0 = dis;Pside0.x = p.x;Pside0.y = p.y;Pside0.z = p.z;}}double b11 = Pside0.y - k1 * Pside0.x;//垂直方向double k2 = -1.0 / k1;double bb = p0.y - k2 * p0.x;double side1_positive = -3;xjPoint Pside1_positive;double side1_negative = 9999999;xjPoint Pside1_negative;for (int j = 0; j < xjListCH.size(); j++){xjPoint p = xjListCH.at(j);double dis = (k2*p.x - p.y + bb) / (sqrt(k2*k2 + 1));if ((dis>=0)&&(dis >= side1_positive)){side1_positive = dis;Pside1_positive.x = p.x;Pside1_positive.y = p.y;Pside1_positive.z = p.z;}if ((dis<0)&&(dis <= side1_negative)){side1_negative = dis;Pside1_negative.x = p.x;Pside1_negative.y = p.y;Pside1_negative.z = p.z;}}double b2 = Pside1_positive.y - k2 * Pside1_positive.x;double b22 = Pside1_negative.y - k2 * Pside1_negative.x;//面积和周长double side1 = abs(side1_positive)+abs(side1_negative);double xjArea = side0 * side1;if (xjArea <= minArea){length = max(side0, side1);width = min(side0, side1);minArea = xjArea;//外接矩形四个点xjPoint br0;br0.x = (b1 - b22) / (k2 - k1);br0.y = k1 * br0.x + b1;xjPoint br1;br1.x = (b11-b22) / (k2-k1);br1.y =  k1* br1.x + b11;xjPoint br2;br2.x = (b2-b11) / (k1-k2);br2.y =  k1* br2.x + b11;xjPoint br3;br3.x = (b2-b1) / (k1-k2);br3.y = k1 * br3.x + b1;xjListMBRpoint.clear();xjListMBRpoint.append(br0);xjListMBRpoint.append(br1);xjListMBRpoint.append(br2);xjListMBRpoint.append(br3);}}}//MBR提示信息QString MBRinfo = "chMBR: length = " + QString::number(length, 'f', 4) + ", ";MBRinfo += "width = " + QString::number(width, 'f', 4) + ", ";MBRinfo += "minimum area = " + QString::number(minArea) + ", ";MBRinfo += "circumference = " + QString::number((length + width) * 2);
}

C++/Qt:最小外接矩形相关推荐

  1. matlab外接矩形,matlab求二值圖像最小外接矩形

    全部來自ilovematlab中文論壇,其中matlab較新的版本不再支持其中的有些函數,或者說有些函數的參數做了改變,因此適當修改后貼出來.注:無意侵權,記錄在此自我學習,順帶服務群眾. 首先是尋找 ...

  2. opencv 轮廓查找, 凸包,最小外接矩形,最小外接圆,最小外接椭圆

    本章内容: 1. 轮廓查找 2. 绘制轮廓 3. 凸包 4.最小外接矩形 5.最小外接圆 6.最小外接椭圆 1.搜索轮廓 2.绘制轮廓 输出结果 3.凸包 输出结果 4.最小外接矩形 输出结果 5.最 ...

  3. OpenCV中minAreaRect()最小外接矩形 cvBoxPoints()计算矩形顶点 RotatedRect和CvBox2D详解

    minAreaRect()函数计算并返回指定点集的最小区域边界斜矩形. RotatedRect minAreaRect(InputArray points) points:输入信息,可以为包含点的容器 ...

  4. 最小外接矩形思路以及实现

    最小外接矩形 外接矩形计算 对一个凸多边形进行外接矩形计算,需要知道当前面的最大xy 和最小xy值,即可获得外接矩形 最小外接矩形计算 对凸多边形的每一条边都绘制一个外接矩形求最小面积.下图展示了计算 ...

  5. python+opencv获取最小外接矩形

    python+opencv获取最小外接矩形 环境 代码 效果 环境 python版本:3.8 opencv版本:4.3.0.36 代码 from PIL import Image from pylab ...

  6. UVA10173(求凸包的面积最小外接矩形)

    题目:10173 - Smallest Bounding Rectangle 求凸包的最小外接矩形的面积. 思路: 旋转卡壳 给定点集S,求S的最小覆盖矩形 最小覆盖矩形的四条边上,其中一条边有至少两 ...

  7. cv2.minAreaRect() 生成最小外接矩形

    简介 使用python opencv返回点集cnt的最小外接矩形,所用函数为 cv2.minAreaRect(cnt) ,cnt是所要求最小外接矩形的点集数组或向量,这个点集不定个数. 1 cv2.m ...

  8. 怎么在matlab中图像中外接矩形,Matlab 最小外接矩形

    Matlab 中并没有发现最小外接矩形的代码,为了方便 下面提供最小外接矩形的代码: 注:这个函数是源于网上找到的代码的改进版,原版不能检测水平线或者垂直线 function [rectx,recty ...

  9. python 提取最小外接矩形_python给人脸带上口罩(简单版)

    导读 因为目前公开的口罩人脸数据比较少,如果想训练一个口罩人脸识别模型,必须依赖大量的人脸数据.为了收集到更多的口罩人脸数据,我们只能利用已有的公开人脸数据上通过程序来模拟人脸带口罩.这篇文章向大家介 ...

最新文章

  1. centos6.5编译安装php7,及配置与nginx通信。
  2. C++使用链表实现stack堆栈(附完整源码)
  3. c语言词法分析程序,词法分析器(c语言实现)
  4. 高仿真的类-BeanDefinitionReader
  5. 【javascript】js处理字符串
  6. linux raw限制端口访出,使用Linux raw socket时需要注意的一些问题
  7. 软件与硬件我该选哪个_MacBook Air 和 MacBook Pro 该选哪个……?
  8. 63 SD配置-交货凭证配置-定义交货的项目类别
  9. zabbix使用Omsa来监控Dell服务器的硬件信息
  10. MegaRAID Storage Manager RAID管理工具基本操作
  11. Android Textview控件基础属性
  12. LeetCode刷题攻略
  13. Input dispatching timed out ANR问题分析
  14. win10无法进入系统:无法加载操作系统,原因是关键系统驱动驱动程序丢失或包含错误
  15. WPS文字怎么插入背景音乐
  16. ppt如何变成pdf
  17. 二见钟情之UML时序图
  18. python dlib人脸识别_python3+dlib人脸识别及情绪分析
  19. MATLAB逻辑回归实例及代码
  20. 从SVN检出Maven工程只有父工程的解决办法

热门文章

  1. js版四舍六入五成双方法
  2. 功率型热敏电阻(NTC)的主要参数及深入介绍
  3. 第二节课20180908
  4. 微服务架构设计总结实践篇,10 步搭建微服务
  5. 超微服务器型号,超微服务器主机配置raid
  6. 已知某公众号的微信号怎样获取该公众号的二维码
  7. 用搜狗输入法原样输出10的若干次方
  8. 《易中天中华史 - 第二卷 国家》读书笔记
  9. 2021年上半年系统集成项目管理工程师上午试题参考解析(二)
  10. 今年底出版《算法竞赛》,这是大纲