MATLAB:求凸包算法
凸包是计算几何中的一个基础问题,它是指在平面上给定n个点,找到这些点的最小凸多边形,该多边形包含所有的n个点。求解凸包的算法有很多种,其中比较常用的有 Graham 扫描算法和 Jarvis 步进算法。本文将介绍两种算法的原理和 MATLAB 实现。
- Graham 扫描算法
Graham 扫描算法是一种经典的凸包算法,其基本思想是将平面上的点按照极角排序,然后依次将点加入凸包之中。具体实现步骤如下:
(1)选择顶点P0:以所有点中纵坐标最小的点为起点P0。
(2)按照点与P0的极角从小到大排序:设其排序结果为P1, P2, …, Pn-1。
(3)构造凸包:初始化栈S=P0+P1,依次将P2, P3, …, Pn-1插入S中。每加入一个点后,判断新的三个点组成的折线是否为“左拐弯”(即逆时针转);如果是,则说明加入的点不会破坏凸包,保留此点;否则,弹出栈顶元素,继续判断。
MATLAB 实现代码如下:
function [h,c] = Graham(points)
% Graham 扫描算法求凸包
% points:n*2 的点矩阵,每行为一个点的横纵坐标
% h:凸包各点的横坐标向量
% c:凸包各点的纵坐标向量
% 选择起点P0
[~,pos] = min(points(:,2));
p0 = points(pos,:);
% 对点按照极角排序
angle = atan2(points(:,2)-p0(2),points(:,1)-p0(1));
[sorted_angle,sorted_index