1、全代码:

%getZhongxin
function [zhongxin1,zhongxin2,smallR,bigR]=getZhongxin(varargin)
%% 此函数用于计算已知边界的不规则图形的最大内切圆和最小外接圆
% 输出:
%     zhongxin1 最大内切圆圆心
%     zhongxin2 最小外接圆圆心
%     smallR    最大内切圆半径
%     bigR      最小外接圆半径
% 输入:
%     bianjie   不规则图形的边界,2 x n
%     cuX       包裹不规则边界的矩形 x 坐标
%     cuY       包裹不规则边界的矩形 y 坐标
% 调用:
%     [zhongxin1,zhongxin2,smallR,bigR]=getZhongxin(bianjie,X2,Y2);
%     [zhongxin1,zhongxin2,smallR,bigR]=getZhongxin(bianjie);
%-------------------------------------------------------------------%%%%    Authors:   Bill O'Hanlon%%%%    EMAIL:     ohanlon@qq.com%%%%    DATE:      24-08-2020
%% 计算出 cuX,cuY,有输入则跳过
bianjie=varargin{1};
XArray=bianjie(1,:);
YArray=bianjie(2,:);
Xmax1=max(XArray);%未取整
Xmin1=min(XArray);
Ymax1=max(YArray);
Ymin1=min(YArray);Xmax=(floor(Xmax1*2)+1)*0.5;
Ymax=(floor(Ymax1*2)+1)*0.5;
Xmin=(floor(Xmin1*2))*0.5;
Ymin=(floor(Ymin1*2))*0.5;%这些已经取整了。
Xmax=ceil(Xmax);
Ymax=ceil(Ymax);
Xmin=floor(Xmin);
Ymin=floor(Ymin);
if nargin==3cuX=varargin{2}; %注意,这里是{, (会是元胞cuY=varargin{3};
elseif nargin==1Y=Ymin:0.0083333333:Ymax; %分辨率0.0083333333°  1°=120X=Xmin:0.0083333333:Xmax; %求逻辑矩阵用到a=size(X,2);b=size(Y,2);Y2=repmat(Y',1,a);cuX=repmat(X,b,1);cuY=flipud(Y2);                %这个纬度得上下翻转一下。
elsedisp('参数不合要求!');return;
end
XArray=bianjie(1,:);
YArray=bianjie(2,:);
[a,b]=size(cuX);
zhongdian=[mean(XArray);mean(YArray)];
R=(max(bianjie(1,:))-min(bianjie(1,:))+max(bianjie(2,:))-min(bianjie(2,:)))/6;%当内切圆不对,可以改这个数
zoom=max(a/20,b/20);%最后只保留900左右的点
smallX=imblizoom(cuX,1/zoom);
smallY=imblizoom(cuY,1/zoom);
sX=smallX(:);
sY=smallY(:);
px=[sX';sY'];
n=size(px,2);
sR=zeros(n,1);bR=zeros(n,1);
m=size(bianjie,2);
dis=zeros(m,1);
for i=1:nxy=px(:,i);det=bianjie-xy;for j=1:mdis(j)=norm(det(:,j));endsR(i)=min(dis);bR(i)=max(dis);
end
smallR=max(sR);%最大内切圆
bigR=min(bR);  %最小外接圆
zhongxin1=[sX(sR==smallR);sY(sR==smallR)];
zhongxin2=[sX(bR==bigR);sY(bR==bigR)];
for i=1:nsmallR=max(sR);zhongxin1=[sX(sR==smallR);sY(sR==smallR)];if norm(zhongxin1-zhongdian)<=Rbreak;elsesR(sR==smallR)=0;continue;end
end
%% 画图
left1=zhongxin1-smallR;  %画内切圆左下角矩形坐标
left2=zhongxin2-bigR;    %画外接圆左下角矩形坐标
figure;
bigcircle=rectangle('Position',[left2',bigR*2,bigR*2],'Curvature',[1,1]);%画圆
hold on;
smallcircle=rectangle('Position',[left1',smallR*2,smallR*2],'Curvature',[1,1]);%画圆
hold on;
plot(bianjie(1,:),bianjie(2,:),zhongxin1(1),zhongxin1(2),'r*',zhongxin2(1),zhongxin2(2),'b*');
bigcircle.FaceColor='r';smallcircle.FaceColor='w';
hold on
detx=Xmax-Xmin; dety=Ymax-Ymin;
rectangle('Position',[Xmin,Ymin,detx,dety]);
axis equal;
axis([Xmin Xmax Ymin Ymax]);
end

依赖函数:

https://blog.csdn.net/Gou_Hailong/article/details/108206521

2、调用

俩效果一样。

[zhongxin1,zhongxin2,smallR,bigR]=getZhongxin(bianjie,X2,Y2);
[zhongxin1,zhongxin2,smallR,bigR]=getZhongxin(bianjie);


注:这是北京市的shp 搞出的不规则图形。


补于2021-3-3

有的朋友对这个代码的原理感兴趣,有的朋友调试过程遇到了bug…bug的话我没办法解决,毕竟这个代码是根据我当时独特的需求写的,像排除bug自己跑起来的话只好自己逐步调试了。关于原理,我回顾了下,补充如下:

算法原理:
先将边界稀疏化(分辨率降低些,提高计算效率),再计算出来不规则边界的最小外包矩形。逐个取外包矩形中的点和边界上的每一个点计算一下距离,这些距离中最大的距离作为备选最小外接圆半径存到数组bR中,这些距离中最小的距离作为备选最大内切圆半径存到数组sR中;将外包矩形中所有的点计算完毕之后,取bR数组中最小的值作为最小外接圆半径,取sR数组中最大的值作为最大内切圆半径。

注:由于时间较久,不知描述是否符合之前的本意,如有错误欢迎批评指正!

Matlab 求不规则图形的 内切圆和外接圆 函数相关推荐

  1. matlab求三维图形表面积,基于MATLAB的不规则平面立体表面积计算

    ·12· 设计与研究 机械 2012 年第 2 期 总第 39 卷 --------------- 收稿日期:2011-06-10 作者简介:和蕴锋(1988-),女,河南漯河人,硕士研究生,主要研究 ...

  2. matlab 求二值图像图形的面积和重心

    图像如下: 代码如下: close all;clear all;clc; I = imread('duobianxing1.jpg'); I = im2bw(I); C = bwlabel(I,4); ...

  3. 用matlab画5日均线,用MATLAB求移动平均线,不用MOVAVG函数,求MA5,MA10 – MATLAB中文论坛...

    移动平均线,简称均线.它是将某一段时间的收盘价之和除以该周期. 比如日线MA5指5天内的收盘价除以5 .请在一张图中用三种不同颜色绘制该股票收盘价数据.5日移动平均MA5.10日移动平均MA10. 时 ...

  4. 已知 方程 用 matlab 求表达式,已知自变量,因变量和函数表达式,可以用matlab求出函数表达式中的未知参数吗...

    答:这不是解方程,这是曲线拟合.如果你的已知的dr,R只有一个点,那么你的未知数是有无数个解的. cftool,拟合函数有一个选项是自定义函数. 答:用polyfit函数,即多项式拟合函数 设x=X- ...

  5. Matlab自适应均线_用MATLAB求移动平均线,不用MOVAVG函数,求MA5,MA10 – MATLAB中文论坛...

    移动平均线,简称均线.它是将某一段时间的收盘价之和除以该周期. 比如日线MA5指5天内的收盘价除以5 .请在一张图中用三种不同颜色绘制该股票收盘价数据.5日移动平均MA5.10日移动平均MA10. 时 ...

  6. 【MATLAB】三维图形绘制 ( 绘制球面 | sphere 函数 | 设置光源 | light 函数 | 相机视线 | view 函数 )

    文章目录 一.绘制球面 1.sphere 函数 2.代码示例 二.设置光源 1.light 函数 2.代码示例 2.代码示例 2 三.相机视线 1.view 函数 2.代码示例 3.代码示例 2 四. ...

  7. matlab求球的体积,【matlab计算不规则物体体积资讯】matlab计算不规则物体体积足球知识与常识 - 足球百科 - 599比分...

    matlab,求不规则三维图形体积? 我咋看也是个光滑曲面呀,哪来的体积?当然假如xy面到曲面之间全被填充为实体,应该能用循环或积分计算每个xy单位面积上的曲顶柱体的体积,然后求和,我用循环尝试了下: ...

  8. 不规则图形数格子的方法_五年级数学上册《方格图中不规则图形的面积计算》教案...

    五年级数学上册<方格图中不规则图形的面积计算>教案 教学内容:教材P100例五及练习二十二第7-11题. 教学目标: 知识与技能:初步掌握"通过将不规则图形近似地看作可求 面积的 ...

  9. matlab 向量取倒数,Matlab 求倒数命令及控制方法

    建立符号变量命令sym和syms调用格式: x=sym('x'), 建立符号变量x: syms x y z , 建立多个符号变量x,y,z: matlab求导命令diff调用格式: diff(函数) ...

  10. MATLAB求二阶隐函数导数,如何用matlab对隐函数求导? 值得收藏

    隐函数求导一般都比较繁琐,下面介绍一下 如何用matlab对隐函数求导,这样一来我们就可以解放双手,轻松求解隐函数的导数. 工具/材料 matlab软件 正常运行电脑 操作方法 01 matlab求导 ...

最新文章

  1. 在多台FMS服务器之间共享流
  2. 网络管理员比赛回顾02-网关、静态路由、动态路由
  3. 计算机内存不足 ssd,电脑提示内存不足怎么办 虚拟内存设置方法【详解】
  4. MPB:南农金巍等-​​​瘤胃甲烷菌的分离培养与保存
  5. mfc edit 超出行数时出现滚动条_千金难买“老鸭头”,是A股唯一可以获利200%的战法,一旦出现,不要犹豫满仓干,后市必定爆涨...
  6. 解除计算机软件开发协议书,计算机软件著作权转让的协议书
  7. 程序猿必备的10款web前端开发插件一
  8. Unmarshalling Error: unexpected element 错误的解决
  9. C# 基础知识 (四).C#简介及托管代码
  10. jsch 移动服务器上文件,jsch上传文件到服务器
  11. 全国计算机等级考试题库二级C操作题100套(第59套)
  12. python如何表示坐标_python – 如何制作x坐标字母?
  13. SpringBoot如何整合定时任务调度
  14. IOS自己主动布局中的浮动布局(6)----MyFloatLayout横空出世
  15. 当遭遇TCP洪水(SYN Flood)后的的诊断思路和处理过程
  16. Qt 中实现在控件中点击鼠标,就在鼠标点击处加载图片的方法
  17. ionic2/ionic3 实现搜索结果中的搜索关键字高亮
  18. Linux下nand flash读写测试
  19. 中小银行传统数据仓库向大数据平台迁移探索
  20. 怎么把EXCEL内的十六进制数进行两位两位倒序排列

热门文章

  1. msvcr71.dll等dll丢失的解决方法
  2. 逃离塔科夫机器码解除,实战解决【100%成功方法】
  3. 《Zero to One》读书笔记
  4. java severs_openssl简介-指令s_server
  5. 组装专用计算机系统吗,组装的电脑有自带系统吗?
  6. am3352 项目记录
  7. 教你轻松创建谷歌账号、谷歌邮箱!
  8. 条码打印软件如何设置双排标签纸尺寸
  9. 201671010415+词频统计软件项目报告
  10. 数学表达式Round2