用Matlab求解绘制2D散点(x y)数据的最小外接圆、沿轴外接矩形
- 0 引言
- 1 原理概述即代码实现
- 1.1 最小外接圆
- 1.2 沿轴外接矩形
- 2 完整代码
- 3 结语
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}
(xi−x)2+(yi−y)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})} (xi−x),计算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代码
,可以执行并进行理解,后面将分享关于包含散点区域最小外接矩形的相关原理和实现方法。希望对你有所帮助。
😜
😜😜
😜😜😜😜