CGAL alphaShape二维点集边界提取

一、算法原理

  二维点集的边界提取。

1、主要函数

头文件

#include <CGAL/Alpha_shape_2.h>

2、参考文献

[1]张鹤,李东升,陈爱军.Alpha-Shapes分段改进算法在三维模拟树枝体积扫描测量中的应用[J].中国测试,2021,47(03):49-58.

二、代码实现

#include <vector>
#include <pcl/io/pcd_io.h>          // PCL读取PCD
#include <pcl/point_types.h>        // PCL点类型

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>

#include <CGAL/Alpha_shape_2.h>
#include <CGAL/Alpha_shape_vertex_base_2.h>
#include <CGAL/Alpha_shape_face_base_2.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <CGAL/IO/read_points.h>
#include <CGAL/IO/write_points.h>
#include <CGAL/algorithm.h>



typedef CGAL::Exact_predicates_inexact_constructions_kernel  K;

typedef K::FT                                                FT;
typedef K::Point_2                                           Point;
typedef K::Segment_2                                         Segment;

typedef CGAL::Alpha_shape_vertex_base_2<K>                   Vb;
typedef CGAL::Alpha_shape_face_base_2<K>                     Fb;
typedef CGAL::Triangulation_data_structure_2<Vb, Fb>          Tds;
typedef CGAL::Delaunay_triangulation_2<K, Tds>                Triangulation_2;
typedef CGAL::Alpha_shape_2<Triangulation_2>                 Alpha_shape_2;

typedef Alpha_shape_2::Alpha_shape_edges_iterator            Alpha_shape_edges_iterator;

template <class OutputIterator>
void alpha_edges(const Alpha_shape_2& A, OutputIterator out)
{
	Alpha_shape_edges_iterator it = A.alpha_shape_edges_begin(),
		end = A.alpha_shape_edges_end();
	for (; it != end; ++it)
		*out++ = A.segment(*it);
}


int main()
{
	//-------------------------加载二维PCD点云数据------------------------------
	pcl::PointCloud<pcl::PointXY>::Ptr cloud(new pcl::PointCloud<pcl::PointXY>);

	if (pcl::io::loadPCDFile<pcl::PointXY>("cgal//cloud.pcd", *cloud) == -1)
	{
		PCL_ERROR("Could not read file\n");
		return -1;
	}
	// ------------------------转为CGAL支持的格式------------------------------
	std::vector<Point> points;
	for (size_t i = 0; i < cloud->size(); ++i)
	{
		double px = cloud->points[i].x;
		double py = cloud->points[i].y;
		points.push_back(Point(px, py));
	}

	Alpha_shape_2 A(points.begin(), points.end(),
		FT(10000),
		Alpha_shape_2::GENERAL);

	std::vector<Segment> segments;
	alpha_edges(A, std::back_inserter(segments));

	std::cout << "Alpha Shape computed" << std::endl;
	std::cout << segments.size() << " alpha shape edges" << std::endl;
	std::cout << "Optimal alpha: " << *A.find_optimal_alpha(1) << std::endl;

	// -----------------------------保存点云-------------------------------
	const std::string output_filename("cgal//CSite_random.xyz");
	if (!CGAL::IO::write_points(output_filename, segments, CGAL::parameters::stream_precision(17)))
		return -1;
	

	return 0;
}

三、结果展示

在这里插入图片描述

CGAL是一个计算几何的C++库,其提供了许多用于算法设计和实现的数据结构和函数。其中就包括了二维平面多边型的布尔运算操作,包括求交集、并集、差集等。这些运算在计算机图形学、地理信息系统、自动化设计等领域都有广泛的应用。 在测试CGAL二维平面多边形布尔运算性能时,需要考虑多个因素,如多边形的大小、数量、形状以及计算机的硬件配置等。我将分别从这些方面来介绍CGAL二维平面多边形布尔运算性能测试的结果。 1. 多边形的大小和数量 测试表明,CGAL能够处理非常大的多边形,例如含有上万个点的多边形。然而,多边形的大小和数量还是会对运算时间产生影响。当多边形数目增加时,运算时间也相应增加。实验表明,当多边形数量为几百到几千时,CGAL处理多边形布尔运算的时间较长,需要几秒钟到几分钟不等。当多边形数量超过一万时,运算时间将变得非常长,可能需要花费数十分钟的时间。 2. 多边形的形状 当多边形的形状很简单时,例如正多边形和矩形,CGAL的运算时间非常短,可以在毫秒或几秒钟内完成。但如果多边形有大量的凹角和复杂的几何形状,CGAL的运算时间将变长。实验表明,当多边形具有纽结、孔洞等复杂形状时,CGAL的运算时间可能会增加几倍或更多。 3. 计算机硬件配置 CGAL二维平面多边形布尔运算的性能还与计算机硬件配置有关。例如,处理大型多边形时,需要更快的处理器和更大的内存。此外,CGAL还可以利用多个处理器来并行处理大型多边形,这将极大地提高计算速度。 综上所述,CGAL二维平面多边形布尔运算的性能测试结果取决于多方面因素。在对运算性能进行测试时,需要综合考虑多边形的大小、数量、形状以及计算机的硬件配置等因素。当然,在实际应用中,还需要根据具体情况选择最适合自己的算法和数据结构。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值