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控件添加点击事件 然后是最小 ...
随机推荐
- xss跨站攻击测试代码
'><script>alert(document.cookie)</script> ='><script>alert(document.cookie)& ...
- Iterator&Vector应用实例
public class test1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-gene ...
- Linux 下安装配置 JDK7
Linux 下安装配置 JDK7 配置环境(debian 7) 自从从Oracle收购Sun近三年来,已经有很多变化.早在8月,甲骨文将“Operating System Distributor Li ...
- ngrok反向代理
关于ngrok ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道.ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放. 为什么使用ngrok? ...
- sqlplus 配置方法及相关命令
sqlplus 配置方法及相关命令 1.配置文件 1.1 全局模式什么叫全局模式呢:当我们配置完sqlplus工具加载配置文件后,无论在哪个目录下登陆数据库,您设置[sqlplus提示符样子,在任何目 ...
- webexam项目杂记
sql 语句 数据库 本身 有数据类型的区分,对于mysql的字符串默认的用单引号''来表示,因此,整个sql 语句就要用双引号来括. 如: $sql = "SELECT * FROM us ...
- 反正切函数求圆周率 atan
#define PI atan(1.0)*4 原理:tan ∏/4=1; atan2: 返回给定的 X 及 Y 坐标值的反正切值.反正切的角度值等于 X 轴正方向与通过原点和给定坐标点 (Y坐标, X ...
- [ruby on rails] 跟我学之(3)基于rails console的查增删改操作
本章节展开对model的介绍:包括查增删改操作.紧接着上面一节<[ruby on rails] 跟我学之HelloWorld> 创建模型 使用命令创建模型 创建表post,默认自带两栏位 ...
- Encode and Decode Strings
Design an algorithm to encode a list of strings to a string. The encoded string is then sent over th ...
- Copy List with Random Pointer
A linked list is given such that each node contains an additional random pointer which could point t ...