当前位置: 首页 > article >正文

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

用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} (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代码,可以执行并进行理解,后面将分享关于包含散点区域最小外接矩形的相关原理和实现方法。希望对你有所帮助。






😜
😜😜
😜😜😜😜


http://www.kler.cn/news/306906.html

相关文章:

  • 代码随想录算法训练营第48天 | LeetCode739.每日温度、 LeetCode496.下一个更大元素I、 LeetCode503.下一个更大元素II
  • Linux 之 RPM [Red - Hat Package Manager]【包管理】
  • JavaScript 事件处理
  • Gateway Timeout504: 网关超时的完美解决方法
  • 【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_kernel() 源码分析
  • 【Webpack--007】处理其他资源--视频音频
  • PostgreSQL - tutorial
  • 我的标志:奇特的头像
  • ARM驱动学习之21_字符驱动
  • Gitlab 中几种不同的认证机制(Access Tokens,SSH Keys,Deploy Tokens,Deploy Keys)
  • Linux线程同步:深度解析条件变量接口
  • Deep Learning-Based Object Pose Estimation:A Comprehensive Survey
  • VUE使用echarts编写甘特图(组件)
  • AI写作助力自媒体,传统模式将被颠覆
  • 网络安全学习(二)初识kali
  • SAP EWM Cross Docking (CD) 越库操作
  • 探索Python中的装饰器
  • 前端基础知识+算法(一)
  • 8- 【JavaWeb】用HTML和CSS来创建一个简洁的登录界面
  • OpenCV_图像像素读写操作
  • STM32_startup文件详解
  • 性能测试的复习4-数据库连接、控制器、定时器
  • 人脸防伪检测系统源码分享
  • 多线程下的共享变量访问数据竞争的问题
  • SSM框架学习
  • GD32E230 RTC报警中断功能使用
  • DockerDocker Compose安装(离线+在线)
  • 汽车免拆诊断案例 | 沃尔沃V40 1.9TD断续工作
  • ensp—相关ospf-3
  • SpringBoot 消息队列RabbitMQ 交换机模式 Fanout广播 Direct定向 Topic话题