用Matlab求解绘制2D散点(x y)数据的最小外接圆、沿轴外接矩形

用Matlab求解绘制2D散点(x y)数据的最小外接圆、沿轴外接矩形


0 引言

  本篇简单介绍下散点数据最小外接圆沿轴外接矩形的简单原理matlab实现过程

1 原理概述即代码实现

1.1 普通外接圆

  求散点外接圆关键是找到外接圆的圆心半径,下面方法是找普通外接圆的方法,即只考虑轴向方向的情况的外接圆,假设有散点数据集 [ x i , y i ] [x_{i},y_{i}] [xi,yi],可以通过以下步骤求解普通外接圆

(1)分别取 x x x的平均和 y y y的平均,可以得到外接圆的圆心坐标

(2)遍历/循环每个散点,通过 ( x i − x ‾ ) 2 + ( y i − y ‾ ) 2 \sqrt{(x^{i}-\overline{x})^2+(y^{i}-\overline{y})^2} (xix)2+(yiy)2 得到每个散点距圆心的距离,然后取距离的最大值即为最小外接圆的半径

% 主过程及图示部分,调用的函数在下一部分
clc;clear;
n = 100;
x = rand(n,1); % 随机数
y = rand(n,1);

figure(1)
scatter(x,y,'o')
hold on

% 绘制圆(方法1)
[center_x,center_y,r] = maxBoundCycle(x,y);
para = [center_x-r, center_y-r, 2*r, 2*r];
rectangle('Position', para, 'Curvature', [1 1],'EdgeColor','g',LineStyle='-.');

% 绘制圆(方法2)
hold on
theta = 0:pi/50:2*pi; %角度[0,2*pi] 
xx = center_x + r*cos(theta);
yy = center_y + r*sin(theta);
plot(xx,yy,'o')

1.2 最小外接圆

  评论区有细心的大佬指出了文章中的的错误,看了下关于外接圆的逻辑,的确存在较大问题,1.1中的内容和1.3的内容逻辑一致,仅考虑了沿着x轴和y轴方向的最小外接情况,对于笔者所使用的场景已经足够,这里还是补充一下关于求解最小外接圆的理解和实现方法。同时,非常感谢@X-Qiang对错误的反馈。

💦💦
  最小外接圆的求解步骤如下:
  (1) 先找点集 ( x i , y i ) {(x_{i},y_{i})} (xi,yi)的凸包点,问题转化为求解凸多边形的最小外接圆;

  (2) 根据3点可以确定一个圆。先拿3个凸包点 ( p 1 p 2 p 3 ) (p_{1} p_{2} p_{3}) (p1p2p3)生成一个圆,这3个点称为基准点,得到圆的圆心坐标 ( O 1 ) (O_{1}) (O1)和半径 ( R 1 ) (R_{1}) (R1);

  (3) 计算剩余凸包点与圆心 ( O 1 ) (O_{1}) (O1)的距离 ( D i ) (D_{i}) (Di),如果 ( D i ) (D_{i}) (Di)中的最大值小于 ( R 1 ) (R_{1}) (R1

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咋(za)说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值