平面点群最小包络圆模型与计算

1 问题描述

很多材料与口头表述中出现了这样一个句子:“求多边形最小外接圆”。事实上这样的描述是不准确的,多边形的外接圆指与多边形各顶点都相交的圆,若多边形存在外接圆,则外接圆唯一。这句话想表明的意思切确的来说,应该解释为求一个最小的圆,能够覆盖整个多边形。在探讨任意多边形的覆盖问题时,用平面点群来取代多边形,则更具备普适性。因此可将原问题转化为:“求平面点群最小包络圆”。

2 数学模型

文字被编辑器吃掉了,我直接上图好了

3 模型求解

3.1 简单算法

在不考虑计算的量的情况下,提出一种简单算法。其基本理论基础是①任意点群,相互距离最大的两点必在该点群的最小包络圆上②最小包络圆与点群至少有两个交点③当交点只有两个时,最小包络圆以距离最大两点的连线为直径④若包络圆与点群中三个及三个以上的点相交,则包络圆为点群中某三点构成的三角形的外接圆。

基于上述基础,算法思想为:先求点群距离最大两点,再与其余点组合形成三角形,迭代判别三角形外接圆是否满足条件。

算法步骤如下所示:

STEP 1: 计算点群P的距离矩阵,选取距离最近两点,设为A、B;

STEP 2: 求以AB为直径的圆O,判断O是否能覆盖所有点,是则输出该圆,否则继续;

STEP 3: 计算所有点到AB的距离,并以距离降序排列点,得到新点群P’;

STEP 4: 从P’中取出当前桟顶的点,与A、B构成三角形T,求T的外接圆O,判断O能否覆盖点群P’中的所有点,是则输出当前圆,否则继续迭代,直到桟为空。

3.2 算法优化

上述算法复杂度高,大批量点群无法高效处理。作为一个最优化问题,可以考虑将上述迭代算法变更为遗传算法、牛顿迭代算法或者共轭梯度算法。

另外,由于点群凸包的最小包络圆与点群包络圆一致,因此可以先求点群的凸包,再基于凸包点进行求解,这样可以大大简化计算量。

4 算例与结果

Matlab环境下,通过P=100*rand(100,2)产生100个

参考文献

[1]用遗传算法求平面点列的最小包容圆[EB/OL]20170306:http://wenku.baidu.com/view/51e154284b73f242336c5f99.html

[2]知乎:用MATLAB画包络圆[EB/OL]20170306:https://www.zhihu.com/question/27569214、

[3]Matlab求三角形外接圆[EB/OL]20170306:http://www.cnblogs.com/tiandsp/p/3995876.html

[4]多边形最小外接圆算法[EB/OL]20170306:

http://wenku.baidu.com/link?url=n-YNirK3qMweJGum3bbvBbBcV9hpnxww0oyyW0TIRqNEjLlodBDWV5PXR1lKkRCCxXe1h9OOHjKilTju89wje1-6shUmr85NcDrsVWA62Xi

[5]Matlab求矩阵最大元素的行列号[EB/OL]20170307:http://blog.csdn.net/llw01/article/details/9263545

附录(Matlab源代码)

function [O,r]= main_calcu(P)

%by 武汉大学孙一璠20170307

%本函数是算法主程序用于体现逻辑

%计算距离矩阵,找到点群长轴两端点

[A,B]=findLongAxis(P);

%判断以长轴为直径的圆是否能够覆盖所有的点

O(1)=(A(1)+B(1))/2;

O(2)=(A(2)+B(2))/2;

r=sqrt((O(1)-A(1))^2+(O(2)-A(2))^2);

if isContain(P,O,r)

T=[A;B];

displayResult(P,O,r,T);

return;

end

%遍历所有其他点,求与AB构成的三角形的外接圆,判断是否能够包含,如果能够包含

d=calcDistance(A,B,P);

P2=[P d];

sortrows(P2,-3);

[m,~]=size(P2);

for i=1:m

tP=P2(i,1:2);

T=[A;B;tP];

[O,r]= triangleCircumcircle(T);

if isContain(P,O,r)

displayResult(P,O,r,T);

return;

end

end

end

function [A,B]=findLongAxis(P)

[m,~]=size(P);

d=ones(m);

for i=1:m

for j=1:m

d(i,j)=sqrt((P(i,1)-P(j,1))^2+(P(i,2)-P(j,2))^2);

end

end

%这里没有考虑多个距离一样的情况,一般情况也能用了

[lie_max,hanghao]=max(d);

[~,liehao]=max(lie_max);

hanghao=hanghao(liehao);

A=P(hanghao,:);

B=P(liehao,:);

end

function flag=isContain(P,O,r)

%用于判断输入圆是否完整地包含了整个点群

[m,~]=size(P);

flag=true;

for i=1:m

if sqrt((O(1)-P(i,1))^2+(O(2)-P(i,2))^2)>r

flag=false;

break;

end

end

end

function d=calcDistance(A,B,P)

%用于求某点与指定线段AB所在直线的距离

a=B(2)-A(2);

b=A(1)-B(1);

c=B(1)*A(2)-B(2)*A(1);

d=abs(a.*P(:,1)+b.*P(:,2)+c)./sqrt(a*a+b*b);

end

function displayResult(P,O,r,T)

%本函数用于绘制点群及其最小包络圆

figure;hold on;

rectangle('Position',[O(1)-r,O(2)-r,2*r,2*r],'Curvature',[1,1]);

plot(P(:,1),P(:,2),'markeredgecolor','k','marker','.','linestyle','none');

plot(O(:,1),O(:,2),'markeredgecolor','r','marker','*','linestyle','none');

plot(T(:,1),T(:,2),'markeredgecolor','b','marker','O','linestyle','none');

axis equal;

end

function[O,r]= triangleCircumcircle(T)

%本函数用于求解任意三角形的外接圆

%O为圆心,r为半径,T为传入三角形,如[1 2;3 4;5 6]

%三角形赋值

xa=T(1,1);ya=T(1,2);

xb=T(2,1);yb=T(2,2);

xc=T(3,1);yc=T(3,2);

%矩阵赋值

A=[xa-xb ya-yb;xa-xc ya-yc];

W=[(xa*xa-xb*xb+ya*ya-yb*yb)/2;(xa*xa-xc*xc+ya*ya-yc*yc)/2];

%求解

O=(A^(-1)*W)';

r=sqrt((O(1,1)-xa)^2+(O(1,2)-ya)^2);

end

平面点群最小包络圆模型与计算(含matlab源码)相关推荐

  1. 【数学建模】基于matlab三维海浪模型仿真【含Matlab源码 1159期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[数学建模]基于matlab三维海浪模型仿真[含Matlab源码 1159期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付 ...

  2. 【LSSVM回归预测】基于matlab灰狼算法优化最小支持向量机GWO-LSSVM数据预测【含Matlab源码 2259期】

    ⛄一.灰狼算法优化最小支持向量机GWO-LSSVM简介 1 算法理论 采用灰狼优化算法的最小二乘支持向量机模型预测时,为避免过拟合现象和检验该模型的有效性,将实证部分主要分为:①基于灰狼优化算法的最小 ...

  3. 【物理应用】基于matlab白鲸算法太阳能光伏模型参数估计【含Matlab源码 2018期】

    ⛄一.太阳能光伏模型简介 1 太阳能电池和光伏模板1 太阳能电池模板是一种能够吸收太阳光并将其转换为电流的半导体装置,也就是太阳能电池板.它是由多个p-n结串联组成的,其转换效率一般为17%左右.电池 ...

  4. 【ARMA仿真】基于matlab ARMA模型卡尔曼滤波【含Matlab源码 2431期】

    ⛄一.ARMA模型 1 ARMA模型介绍及应用 对于平稳时间序列,自回归移动平均(ARMA)模型可用于研究时间经济变量的变化规律,ARMA(p,q)模型包括一个自回归过程AR§和一个移动平均MA(q) ...

  5. 【电力预测】基于matlab GUI灰色模型电力负荷预测【含Matlab源码 769期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [电力负荷预测]基于matlab GUI灰色模型电力负荷预测[含Matlab源码 769期] 获取代码方式2: 通过订阅紫极神光博客付费专 ...

  6. 【数学建模】基于matlab船舶三自由度MMG模型【含Matlab源码 1925期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[数学建模]基于matlab船舶三自由度MMG模型[含Matlab源码 1925期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式 ...

  7. 【光学】基于matlab GUI维达尔之眼计算【含Matlab源码 2545期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI维达尔之眼计算[含Matlab源码 2545期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  8. 【机械仿真】基于matlab GUI直齿圆柱齿轮应力计算【含Matlab源码 2077期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab GUI直齿圆柱齿轮应力计算[含Matlab源码 2077期] 点击上面蓝色字体,直接付费下载,即可. 获取代 ...

  9. 【天体学】基于matlab GUI太阳天顶角计算【含Matlab源码 2229期】

    一.⛄获取代码方式 获取代码方式1: 完整代码已上传我的资源:[天体学]基于matlab GUI太阳天顶角计算[含Matlab源码 2229期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

最新文章

  1. 能在不同的深度学习框架之间转换模型?微软的MMdnn做到了
  2. 12个深度学习面试问题
  3. 在Ubuntu上源码安装MySQL+安装问题解决+安全优化
  4. 读书笔记:php_tizag_tutorial
  5. Spring 配置文件的差异
  6. C#使用CLR/C++的DLL间接调用Native C++的DLL
  7. 配置 Sybase数据源
  8. 基金本子提交在即!这11个问题现在改还来得及
  9. 学习MiniGui之多线程机制【转】
  10. centos编译安装配置支持ssl加密的mysql replication
  11. oracle把列数据串成一个字符串,一组数据,如何根据一个字段值分组后,把另一字段的字符串累加连接起来?...
  12. Leetcode-5063 Last Stone Weight(最后一块石头的重量)
  13. haoi2018奇怪的背包题解
  14. 智慧办公室空间管理系统方案优点
  15. oeasy教您玩转vim - 3 - # 打开文件
  16. 单耳蓝牙耳机怎么连接_蓝牙耳机怎么连接
  17. 2022-04- 聂卫平围棋道场-小汪小喵学围棋
  18. 大英博物馆天猫开店,本王的宝贝都要被你们玩坏啦!
  19. 阿里云压缩包无法分享解决方案
  20. 韩国利用三星区块链技术打击海关诈骗

热门文章

  1. 1. 出现次数最多的数
  2. word打印成pdf图片显示不全
  3. 支付渠道对接验签失败
  4. 告别「佃商」,做拥有独立平台的真「电商」!
  5. 安全开发之w9scan扫描器源码学习
  6. 从世界棒球经典赛,到MLB新赛季到来!
  7. 什么是PixelCNN
  8. 2017年1月10号
  9. Java 欧拉工程 第三十一篇【考察英国货币面值的组合问题】
  10. oracle runc n m,19cRAC增删节点