平面点集的凸包可理解为包含所有点的最小凸多边形(点可以在多边形边上或在其内)。这里给出一种求解方法。

一、基本思路

先找所有点中 y 坐标最大最小的点Pmax、Pmin,所找点必定是凸包上的点;

平面点集的凸包计算

找距离直线PmaxPmin两侧最远的点P1,P0,构成初始三角形平面点集的凸包计算, 平面点集的凸包计算

平面点集的凸包计算

再对每个三角形新生成的边(平面点集的凸包计算平面点集的凸包计算平面点集的凸包计算平面点集的凸包计算)继续找与改变对应顶点(平面点集的凸包计算)不在同一侧的最远点。

平面点集的凸包计算

二、算法流程

1 找所有点中 y 坐标最大和最小的点

     1.1 若找到的点少于两个,return,输出(无凸包结构)

     1.2 若y坐标最大最小点各只有一个记为Pmax,Pmin,找直线PmaxPmin两侧最远的点P1,P0,将构成的三角形平面点集的凸包计算, 平面点集的凸包计算放入堆栈TriStack

     1.3 若找到的点大于两个,把这些点能组成的三角形放入堆栈TriStack

2 若TriStack不为空

     2.1 三角形出栈,找三角形前两个顶点的对边与该点异侧的最远点

     2.2 若点存在,边与点组成三角形放入TriStack

     2.3 若点不存在,该边存入Boundary,返回2

3 返回 Boundary

 

三、实现代码

该算法由matlab实现:

 1 clc;
 2 clear;
 3 N = 74;
 4 DataPoints = [(1:N)', rand(N, 2).*100];
 5 plot(DataPoints(:, 2), DataPoints(:, 3), '.');
 6 % grid on;
 7 X = DataPoints(:,2);
 8 Y = DataPoints(:,3);
 9 
10 %% 
11 % 根据 y 方向最值点确立初始三角形
12 % 找 y 最大和最小值的点 --------
13 [Ymax, Ymax_i] = max(Y);
14 [Ymin, Ymin_i] = min(Y);
15 PymaxPymin = [X(Ymin_i) - X(Ymax_i), Y(Ymin_i) - Y(Ymax_i)];
16 PtNum = N;
17 % 找距离直线 PymaxPymin 两侧最远点 --------
18 PtNum_p = 1; PtNum_n = 1;
19 Dis_p = 0; Dis_n = 0;
20 for j = 1 : PtNum
21     PjPymax = [X(Ymax_i) - X(j), Y(Ymax_i) - Y(j)];
22     PjPymin = [X(Ymin_i) - X(j), Y(Ymin_i) - Y(j)];
23     Tri_erea = det([PjPymax; PjPymin]);
24     if Tri_erea < 0
25         if Dis_n < abs(Tri_erea)
26             Dis_n = abs(Tri_erea);
27             PtNum_n = j;
28         end
29     else
30         if Dis_p < Tri_erea
31             Dis_p = Tri_erea;
32             PtNum_p = j;
33         end
34     end
35 end
36 
37 % 计算凸包边界 ----------
38 TriStack = [];
39 TriStack(1, :) = [Ymax_i, Ymin_i, PtNum_p];
40 TriStack(2, :) = [Ymax_i, Ymin_i, PtNum_n];
41 Boundary = FindBoundary(TriStack, DataPoints);
42 hold on;
43 for i = 1 : size(Boundary, 1)
44     plot([X(Boundary(i,1)), X(Boundary(i,2))], ...
45     [Y(Boundary(i,1)), Y(Boundary(i,2))], '-');
46 end
主程序

相关文章:

  • 2021-11-06
  • 2022-12-23
  • 2021-06-22
  • 2021-08-31
  • 2021-07-11
  • 2021-12-25
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-09-25
  • 2022-12-23
  • 2022-01-10
  • 2021-09-13
  • 2021-10-02
  • 2021-09-09
  • 2022-01-14
相关资源
相似解决方案