首先,它按曲率值对点进行排序。之所以需要这样做,是因为该区域从具有最小曲率值的点开始增长。这样做的原因是曲率最小的点位于平坦区域(从最平坦的区域增长可以减少段的总数)。
算法选取曲率值最小的点并开始区域的增长,直到点云中没有点为止。这个过程发生如下:
PointCloud A; // A 代表点云 R_list; // 存放分类后的点云 while (! A.empty()) // A 不为空 { // 初始化当前分类区域 R = 0 // 初始化当前种子集合 S = 0 // 从 A 中选取 曲率最小的点 Pmin // 将 Pmin 加入种子集合 S, 当前分类区域 R, 从点云集合 A 中去除 for(;;) // 遍历种子集合 S { // 从种子集合中取出一个种子,寻找种子的近邻点,存至集合 R 中 for (;;) // 遍历近邻点集合 R { // 逐一从 R 中取出各点 if () // 判断该点的法线与种子点法线差值是否小于阈值 { // 满足条件,将该点加入当前分类区域 R,从点云集合 A 中删除 if () // 判断该点的曲率与种子点曲率差值是否小于阈值 { // 满足条件,将该点加入种子集合 S } } } } // 将当前分类区域 R 加入分类列表 R_list 中 }