个人有个习惯:学习一个算法,要有代码能单步逐行理解。

正好这两天研究了一下凸包算法。留个记录文档吧。

代码如下,有详细备注。

% 凸包算法理解  
clear all;close all;clc;

%% 数据源
data_x=[-2.96,-3.26,-3.26,-2.96,-3.23,-2.93,-2.98,-3.28,-3.83,-4.13,-4.13,-3.83,-3.44,-3.74,-3.74,-3.44,-3.93,-4.23,-4.23,-3.93,-3.96,-4.26];
data_y=[29.21,29.21,28.91,28.91,28.65,28.65,29.46,29.46,28.86,28.86,28.56,28.56,29.42,29.42,29.12,29.12,29.6,29.6,29.3,29.3,29.85,29.85];

data=[data_x;data_y]';
hfig=plot_number(data_x,data_y);  %..绘制数据并标记ID
data_number = length(data_x);
hull = [];  %..记录凸包的ID
inner = [];  %..记录内点的ID
undefined = (1 : data_number)';

[~, lowest_y_id] = min(data_y);  %..查找y最小值点,将该点作为起始点。

% Calculate angles between X axis and each segment, connecting the origin
% with all of the data.
u = data(lowest_y_id,1:2);  %..起始点的数据。
angles = zeros(data_number,1);
for i = 1 : data_number
    v = data(i, 1 : 2);    
    w = v - u;
    angles(i) = atan2d(w(2), w(1));%..所有点到起始点的夹角。
end
% Sort data in according to it's angles with the X axis.
undefined = [undefined,angles,data(:,1)];
undefined = sortrows(undefined, 3); %..先针对x值的大小进行排序
undefined = sortrows(undefined, 2); %..再根据角度的大小进行排序
undefined = undefined(:, 1);  %..排序之后的序号

% First point will be on the convex hull.
hull = undefined(1);  %..将待处理数据集中的第一个点(就是上面的起始点)作为凸包点。
undefined = [undefined; undefined(1)];
undefined(1) = [];%..将起始点放在待处理点集的最后。

% Loop through all data and remove those of them which are not on the border
% of the convex hull.
while length(undefined)>=2
    while true
        test_ids = [hull(end);undefined(1:2)]; %..凸包点集中最后一个点,与待检测点集中前两个点组成test点集。
        test_data = data(test_ids,:); %..待检测点集的数据。
        
        if Direction_determine(test_data(1,:),test_data(2,:),test_data(3,:))  %..根据叉积判断当前3个点集的方式是顺时针还是逆时针。
            break
        end
        inner = cat(1,inner,undefined(1)); %..将待处理点集中第一个元素归到内点点集中。记录内点的ID
        undefined(1)=[]; %..从待处理点集中删除已经归到内点点集的点。
        undefined = cat(1, hull(end), undefined); %..将凸包点集最后一个点重新拉回到待检测点集,并置于首位。
        hull(end,:) = [];%..从凸包点集中删除已经归到待处理点集中的点。
    end
    %..3个点处于逆时针的位置,则可以将待处理点集中第一个元素暂时归到凸包点集中。
    hull = cat(1,hull,undefined(1));  %..归入凸包点集
    undefined(1)=[]; %从待处理点集中删除已经归到凸包点集的点。
end
hull = cat(1,hull,undefined(1)); %..将待处理点集中最后一个点归到凸包点集中。

%..绘制凸包
plot(data(hull,1),data(hull,2),'.-r');
hold on;

function result = Direction_determine(a, b, c)   
% 3个点组成两个向量。然后求两个向量的叉积,并根据叉积的方向确定两个向量的关系。
% 根据右手定则,逆时针向上为正,顺时针向下为负。(需要理解叉集的基本概念)
%
    x1=b(1) - a(1); %..第一个向量是(x1,y1)
    y1=b(2) - a(2);
    x2=c(1) - a(1); %..第二个向量是(x2,y2)
    y2=c(2) - a(2);
    result = ((x1 * y2) - (x2 * y1) >= 0);
end

function [hfig] = plot_number(X,Y)
    %plot_number 以绘制X,Y二维散点图并标出序号
    hfig=figure(100);
    scatter(X,Y,'r.')%绘制散点图
    hold on
    for i=1:max(size(X))
        c = num2str(i);%数字转字符
        text(X(i),Y(i),c);%在图上显示文字
    end
    hold on;
end

凸包算法理解——基于MATLAB代码相关推荐

  1. COI实验室技能:常见的图像增强算法(含MATLAB代码)

    COI实验室技能:常见的图像增强算法(含MATLAB代码)   成像系统采集到的图片有时不一定具有很好的图像质量,往往需要进行一些图像增强的操作.本文主要整理了几种常见的图像增强算法,包括:同态滤波. ...

  2. 智能优化算法:海鸥算法原理及Matlab代码

    智能优化算法:海鸥算法原理及Matlab代码 文章导航 1. 算法原理 2. SOA算法流程 2.1 迁徙行为(exploration ability) 2.2 攻击行为(exploitation a ...

  3. 【聚类算法】基于matlab划分法k-means聚类算法【含Matlab源码 1941期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[聚类算法]基于matlab划分法k-means聚类算法[含Matlab源码 1941期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  4. MUSIC算法原理及MATLAB代码 阵列信号处理

    MUSIC算法原理及MATLAB代码 阵列信号处理 MUSIC(multiple signal classification algorithm)算法是一种基于矩阵特征空间分解的方法.从几何角度讲,信 ...

  5. 【优化算法】基于matlab量子粒子群算法求解单目标优化问题【含Matlab源码 2203期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[优化算法]基于matlab量子粒子群算法求解单目标优化问题[含Matlab源码 2203期] 点击上面蓝色字体,直接付费下载,即可. 获 ...

  6. 【聚类算法】基于matlab改进的粒子群算法优化K-means算法【含Matlab源码 1946期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[聚类算法]基于matlab改进的粒子群算法优化K-means算法[含Matlab源码 1946期] 点击上面蓝色字体,直接付费下载,即可 ...

  7. 【优化算法】基于matlab象鼻虫损害优化算法 (WDOA)【含Matlab源码 2228期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[优化算法]基于matlab象鼻虫损害优化算法 (WDOA)[含Matlab源码 2228期] 点击上面蓝色字体,直接付费下载,即可. 获 ...

  8. 回声消除AEC算法(含Matlab代码)

    基于自适应滤波器的回声消除AEC算法(含Matlab代码) 摘要 自适应滤波器 声学回波抵消 AEC算法解析 LMS算法 NLMS算法 VSNLMS算法 APLMS算法 LMS-Newton算法 PF ...

  9. 【优化算法】基于matlab反向策略的麻雀搜索算法【含Matlab源码 1918期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[优化算法]基于matlab反向策略的麻雀搜索算法[含Matlab源码 1918期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式 ...

最新文章

  1. mysql 存储过程月单拆天单_MySQL之存储过程按月创建表
  2. [Codeforces Round #162 (Div. 2)]A. Colorful Stones (Simplified Edition)
  3. 学python需要什么基础知识-学习python需要什么基础
  4. html中怎么使用数字轮播,【求助】页面上显示几个数字,打开html的时候希望能滚动起来...
  5. ROS:ubuntuKylin17.04-Ros使用OrbSLAM2
  6. WiresShark 图解教程1
  7. 如何编译并使用x264库
  8. 享誉全球的 Java 经典著作《Java核心技术》Java 17
  9. 【echarts】使用心得之ChinaMap
  10. 2014 史丰收速算
  11. c语言程序实现索引查找,索引查找之英语词典(C语言实现)
  12. 第一章 Activity的生命周期和启动模式
  13. ESP32定时器睡眠模式
  14. CentOS 7 使用 Nginx 搭建视频点播服务器
  15. dad my_My dad英语绘本.ppt
  16. unity2D横版游戏教程-3 Cinemachine镜头移动
  17. Linux下GPT分区,gdisk修复损坏的分区表
  18. java 多线程的三种写法
  19. 2022视力矫正展,2022青少年眼睛健康展会,护眼产品展
  20. tof摄像头手势识别_揭秘国内独家TOF深度摄像头,助力机器人避障与室内导航

热门文章

  1. 分享前端开发常用代码片段
  2. 汉诺塔算法 c语言实验报告,C语言汉诺塔算法原理分析与实践
  3. opencv_python
  4. 定位定位定位定位定位定定定定定位
  5. 计算机平面设计单招的分数线,单招学校分数线大概多少 单招最低分数是多少...
  6. python调整视频播放速度
  7. Oracle的学习心得和知识总结(八)|Oracle数据库PL/SQL语言GOTO语句技术详解
  8. 18、想蹭网先解开密码
  9. 007在WIN7下的安装AI2018
  10. Windows下Redis集群配置