用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 沿轴外接矩形

  通常外接矩形指的是面积最小的外接矩形沿轴外接矩形(自己给命的名😜)就是矩形的长、宽分别和x轴、y轴平行的矩形。沿轴外接矩形的原理与上面介绍的外接圆的原理相似, 关键是求矩形的四个角点的坐标。仍假设有散点数据集 [ x i , y i ] [x_{i},y_{i}] [xi,yi],具体步骤如下:

(1)分别取 x x x的平均和 y y y的平均,可以得到沿轴外接矩形的绘图中心坐标;

(2)遍历/循环每个散点的x坐标,根据 ( x i − x ‾ ) {(x^{i}-\overline{x})} (xix),计算x方向距中心点的距离 d x i dx_{i} dxi,取 d x i dx_{i} dxi最大值 d x m a x + x ‾ dx_{max}+\overline{x} dxmax+x和最小值 d x m i n + x ‾ dx_{min}+\overline{x} dxmin+x 得到沿X轴矩形的最小值 x m i n x_{min} xmin和最大值 x m a x x_{max} xmax

(3)同理在y方向上执行如(2)中相同的计算过程,得到y轴的最小值 y m i n y_{min} ymin和最大值 y m a x y_{max} ymax

(4)得到矩形4个角点的坐标,就可以构造出一个封闭图形,即为所需矩形;

% 主程序及绘图示例,所需函数在下一部分
clc;clear;
n = 100;
x = rand(n,1); % 随机数
y = rand(n,1);

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

% 散点x y最大外接矩形
hold on
[boundary] = maxBoundRect(x,y);
plot(boundary(:,1),boundary(:,2),Color='b',LineStyle='-',LineWidth=1.2);

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')

% 散点x y外接矩形(沿轴)
hold on
[boundary] = maxBoundRect(x,y);
plot(boundary(:,1),boundary(:,2),Color='b',LineStyle='-',LineWidth=1.2);
% 计算散点外接矩形(沿轴)
function [boundary] = maxBoundRect(x,y)
	center_x = mean(x);
	center_y = mean(y);
    listx = (x - center_x);
    I = find(listx < 0);
    x1 = listx(I);
    minx = min(x1) + center_x;
    I = find(listx >= 0);
    x1 = listx(I);
    maxx = max(x1) + center_x;

    listy = (y - center_y);
    I = find(listy < 0);
    y1 = listy(I);
    miny = min(y1) + center_y;
    I = find(listy >= 0);
    y1 = listy(I) ;
    maxy = max(y1) + center_y;

    boundary = zeros(5,2);
    boundary(1,:) = [minx,miny];
    boundary(2,:) = [minx,maxy];
    boundary(3,:) = [maxx,maxy];
    boundary(4,:) = [maxx,miny];
    boundary(5,:) = [minx,miny];

end
% 计算散点外接圆
function [center_x,center_y,r] = maxBoundCycle(x,y)
	center_x = mean(x);
	center_y = mean(y);
	list_distance = sqrt((x - center_x).^2 + (y - center_y).^2);
	r = max(list_distance);
end

3 结语

💦💦💦💦💦
  本篇简单介绍了散点数据最小外接圆沿轴外接矩形原理实现方法,提供了完整的Matlab代码,可以执行并进行理解,后面将分享关于包含散点区域最小外接矩形的相关原理和实现方法。希望对你有所帮助。






😜
😜😜
😜😜😜😜

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咋(za)说

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

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

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

打赏作者

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

抵扣说明:

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

余额充值