matlab练习程序(最小包围矩形)
又是计算几何,我感觉最近对计算几何上瘾了。
当然,工作上也会用一些,不过工作上一般直接调用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练习程序(最小包围矩形)的更多相关文章
- opencv3寻找最小包围矩形在图像中的应用-滚动条
#include<opencv2/opencv.hpp> #include<iostream> #include<vector> using namespace c ...
- matlab练习程序(Ritter‘s最小包围圆)
原始算法是sphere,我这里简化为circle了. Ritter's求最小包围圆为线性算法,因为非常简单,所以应用非常广泛. 该算法求出的圆比最优圆大概会大个5%到20%左右,求最优圆应该可以用Bo ...
- UVA10173 Smallest Bounding Rectangle 最小面积矩形覆盖
\(\color{#0066ff}{题目描述}\) 给定n(>0)二维点的笛卡尔坐标,编写一个程序,计算其最小边界矩形的面积(包含所有给定点的最小矩形). 输入文件可以包含多个测试样例.每个测试 ...
- WPF程序最小化到任务通知栏
我们通常使用的桌面软件,都可以最小化到任务通知栏,并且可以从任务通知栏再打开当前软件,或者通过软件的快捷方式从任务通知栏呼出. 我们可以通过下面的方式把WPF程序最小化到任务栏.由于WPF并没有实现N ...
- matlab练习程序(SUSAN检测)
matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...
- opencv学习之路(26)、轮廓查找与绘制(五)——最小外接矩形
一.简介 二.轮廓最小外接矩形的绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //轮廓最小外 ...
- windows vbs启动多个应用程序并使程序最小化(显示桌面)
windows vbs启动多个应用程序并使程序最小化(显示桌面) CreationTime--2018年7月26日11点18分 Author:Marydon 1.应用场景 每天开机后,都需要打开平 ...
- (转)matlab练习程序(HOG方向梯度直方图)
matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...
- C# 设置程序最小化到任务栏右下角,鼠标左键单击还原,右键提示关闭程序
首先设置程序最小化到任务栏右下角 先给窗口添加一个notifyIcon控件 为notifyIcon控件设置ICO图标(不设置图标将无法在任务栏显示) 给notifyIcon控件添加点击事件 然后是最小 ...
随机推荐
- struts2基本配置
struts.xml 放在src目录下 <?xml version="1.0" encoding="UTF-8"?> <struts> ...
- 在Microsoft-IIS/10.0上面部署mvc站点的时候,出现404的错误
写在前面 在家自己弄了一个项目,想部署在电脑上用手机来访问,总是出现404的错误.路由什么的没有写错啊,最后发现是映射程序的问题,在安装的时候iis很多功能没有安装,又将iis的其他没有安装的功能勾选 ...
- Entity Framework CodeFirst数据迁移
前言 紧接着前面一篇博文Entity Framework CodeFirst尝试. 我们知道无论是“Database First”还是“Model First”当模型发生改变了都可以通过Visual ...
- HDOJ 2389 Rain on your Parade
HK.... Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 655350/165535 K ...
- Summarize Series For Burying My College
Summarize Series For Burying My College For Grade ...
- CSUST 1503 ZZ买衣服
解题报告:题目大意是输入两个数N和M,N表示一开始输入N个字符串,并且保存起来,然后再输入M个字符串,并且在输入M个字符串的同时要求判断每次输入的字符串是否已经存在,要注意的是后面输入的M个字符串每次 ...
- SSH 内网端口转发实战
导读 大家都知道SSH是一种安全的传输协议,用在连接服务器上比较多.不过其实除了这个功能,它的隧道转发功能更是吸引人. 如果两个内网之间的linux服务器需要互相登录,或需要互相访问内网某个端口,担忧 ...
- Leetcode 之Validate Binary Search Tree(53)
判断是否是有效的二叉搜索树,即左子树的值小于根结点,右子树的值大于根结点.可以采用递归的方式来完成,递归时如何 传递有效的参数与根结点进行比较,是此题的难点. bool isValidBST(Tree ...
- HDOJ 1590
#include<stdio.h> #include<iostream> #include<stdlib.h> #include<string.h> u ...
- Segment Tree Modify
For a Maximum Segment Tree, which each node has an extra value max to store the maximum value in thi ...