又是计算几何,我感觉最近对计算几何上瘾了。

当然,工作上也会用一些,不过工作上一般直接调用boost的geometry库。

上次写过最小包围圆,这次是最小包围矩形,要比最小包围圆复杂些。

最小包围矩形可不一定是个直立的矩形,也可能像下图一样是倾斜的。

求法如下:

1.求多边形凸包,这里凸包直接调用系统函数了,细节可以参考这里,虽然当时写的不怎么样。

2.将凸包两个相邻的点连线作为矩形一条边。

3.寻找凸包上距离已得到的边最远的点,过该点做平行线,得到矩形第二条边。

4.将凸包上点向已求得的边投影,求得投影点相距最远的两个点,过该两点做直线,作为矩形另外两条边。

5.遍历凸包所有相邻两点从新运行2~4,将面积最小的矩形作为求得结果。

通常情况下,矩形会过随机点中的5个点。

结果如下:

matlab代码如下:

clear all;close all;clc;

n=;
p=rand(n,); ind=convhull(p(:,),p(:,));
l=length(ind); hull=p(ind,:); %随机点凸包 area=inf;
for i=:l
p1=hull(i-,:); %凸包上两个点
p2=hull(i,:); k1=(p1()-p2())/(p1()-p2()); %连接两点的直线,作为矩形的一条边
b1=p1()-k1*p1(); d=abs(hull(:,)*k1-hull(:,)+b1)/sqrt(k1^+); %所有凸包上的点到k1,b1直线的距离 [h ind]=max(d); %得到距离最大的点距离,即为高,同时得到该点坐标
b2=hull(ind,)-k1*hull(ind,); %相对k1,b1直线相对的另一条平行边k1,b2; k2=-/k1; %以求得的直线的垂线斜率 b=hull(:,)-k2*hull(:,); %过凸包所有点构成的k2,b直线系
x1=-(b1-b)/(k1-k2); %凸包上所有点在已求得的第一条边的投影
y1=-(-b*k1+b1*k2)/(k1-k2); x2=-(b2-b)/(k1-k2); %凸包上所有点在已求得的第二条边的投影
y2=-(-b*k1+b2*k2)/(k1-k2); [junk indmax1]=max(x1); %投影在第一条边上x方向最大与最小值
[junk indmin1]=min(x1); [junk indmax2]=max(x2); %投影在第二条边上x方向最大与最小值
[junk indmin2]=min(x2); w=sqrt((x1(indmax1)-x1(indmin1))^+(y1(indmax1)-y1(indmin1))^); %矩形的宽 if area>=h*w %使面积最小
area=h*w;
pbar=[x1(indmax1) y1(indmax1); %矩形四个角点
x2(indmax2) y2(indmax2);
x2(indmin2) y2(indmin2);
x1(indmin1) y1(indmin1)];
end
end
pbar(,:)=pbar(,:); hold on;
plot(p(:,),p(:,),'.');
plot(pbar(:,),pbar(:,),'r')
axis equal;

matlab练习程序(最小包围矩形)的更多相关文章

  1. opencv3寻找最小包围矩形在图像中的应用-滚动条

    #include<opencv2/opencv.hpp> #include<iostream> #include<vector> using namespace c ...

  2. matlab练习程序(Ritter‘s最小包围圆)

    原始算法是sphere,我这里简化为circle了. Ritter's求最小包围圆为线性算法,因为非常简单,所以应用非常广泛. 该算法求出的圆比最优圆大概会大个5%到20%左右,求最优圆应该可以用Bo ...

  3. UVA10173 Smallest Bounding Rectangle 最小面积矩形覆盖

    \(\color{#0066ff}{题目描述}\) 给定n(>0)二维点的笛卡尔坐标,编写一个程序,计算其最小边界矩形的面积(包含所有给定点的最小矩形). 输入文件可以包含多个测试样例.每个测试 ...

  4. WPF程序最小化到任务通知栏

    我们通常使用的桌面软件,都可以最小化到任务通知栏,并且可以从任务通知栏再打开当前软件,或者通过软件的快捷方式从任务通知栏呼出. 我们可以通过下面的方式把WPF程序最小化到任务栏.由于WPF并没有实现N ...

  5. matlab练习程序(SUSAN检测)

    matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...

  6. opencv学习之路(26)、轮廓查找与绘制(五)——最小外接矩形

    一.简介 二.轮廓最小外接矩形的绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //轮廓最小外 ...

  7. windows vbs启动多个应用程序并使程序最小化(显示桌面)

      windows vbs启动多个应用程序并使程序最小化(显示桌面) CreationTime--2018年7月26日11点18分 Author:Marydon 1.应用场景 每天开机后,都需要打开平 ...

  8. (转)matlab练习程序(HOG方向梯度直方图)

    matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...

  9. C# 设置程序最小化到任务栏右下角,鼠标左键单击还原,右键提示关闭程序

    首先设置程序最小化到任务栏右下角 先给窗口添加一个notifyIcon控件 为notifyIcon控件设置ICO图标(不设置图标将无法在任务栏显示) 给notifyIcon控件添加点击事件 然后是最小 ...

随机推荐

  1. gdb调试多进程和多线程命令

     gdb调试多进程和多线程命令 来源:http://blog.csdn.net/pbymw8iwm/article/details/7876797 1. 默认设置下,在调试多进程程序时GDB只会调试主 ...

  2. R与JAVA的整合

    R是统计计算的强大工具,而JAVA是做应用系统的主流语言,两者天然具有整合的需要.关于整合,一方面,R中可以创建JAVA对象调用JAVA方法,另一方面,JAVA中可以转换R的数据类型调用R的函数,互相 ...

  3. Javascript网页摇一摇

    function init(){ if (window.DeviceMotionEvent) { // 移动浏览器支持运动传感事件 window.addEventListener('devicemot ...

  4. Entity Framework 自动生成CodeFirst代码

    前言 在前面的文章中我们提到Entity Framework的“Code First”模式也同样可以基于现有数据库进行开发.今天就让我们一起看一下使用Entity Framework Power To ...

  5. 【Python】 Django 怎么实现 联合主键?

    unique_together¶ Options.unique_together¶ Sets of field names that, taken together, must be unique: ...

  6. 【Django】Django 如何支持 分组查询、统计?

    代码: from django.db.models import Sum alarm_sum_group_items = models.FILE_PROTECT_ALARM.objects.filte ...

  7. (原创)Python字符串系列(1)——str对象

    在本博客 <Python字符串系列> 中,将介绍以下内容: Python内置的str对象及操作 字符串的格式化 Python中的正则表达式 re模块 本文将介绍Python内置的 str ...

  8. DP:Wooden Sticks(POJ 1065)

    摆木棍 题目大意:即使有一堆木棍,给一个特殊机器加工,木棍都有两个属性,一个是l一个是w,当机器启动的时候(加工第一根木棒的时候),需要一分钟,在这以后,设机器加工的上一根木棒的长度是l,质量是w,下 ...

  9. 两个文件去重的N种姿势

    最近利用shell帮公司优化挖掘关键词的流程,用shell替代了多个环节的操作,极大提高了工作效率. shell在文本处理上确有极大优势,比如多文本合并.去重等,但是最近遇到了一个难搞的问题,即两个大 ...

  10. Balance(poj 1837)

    题意:一个天平上有C个挂钩,第i个挂钩的位置为C[i],C[i] < 0表示该挂钩在原点的左边,C[i] > 0表示该挂钩在原点的右边:然后给出G个钩码的重量,问有多少种挂法使得天平保持平 ...