PCL 耳切法三角剖分(Surface_EarClipping)

PCL专栏目录及须知

用于简单多边形的三角剖分。

1.耳切法

大致思想:

(1)多边形的一个顶点和它相邻两个顶点可以组成一个三角形,如果这个三角形内部不存在这个多边形的其他顶点,那么就可以把这个由该顶点及其相邻点组成的三角形当做一个“耳朵”,沿着这两个相邻顶点切下这个“耳朵”,并移除“耳尖”所代表的顶点。

(2)然后对剩下的顶点组成的多边形重复上述的这个操作。

(3)直到这个多边形只剩3个顶点。即把这个多边形完全分解为三角形。

如下图:

1)对左图原始多边形,执行一次切耳之后,得到右图的一次切耳之后的耳朵三角形(耳朵1)、及剩余多边形。

2)不停重复切耳,得到如下结果。

2.使用场景

简单多边形的三角剖分。

3.完整代码

#include <pcl/io/obj_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/surface/ear_clipping.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>

int main()
{
	/****************耳切法三角剖分********************/
	pcl::PolygonMesh::Ptr cloud_obj_mesh(new pcl::PolygonMesh);
	pcl::io::loadPLYFile("D:/code/csdn/data/bunny3.ply", *cloud_obj_mesh);       // 读取为mesh格式

	// 耳切法三角剖分
	pcl::EarClipping surface;
	pcl::PolygonMesh::ConstPtr inMesh(cloud_obj_mesh);		// 设置输入三角模型
	surface.setInputMesh(inMesh);
	pcl::PolygonMesh outMesh;								// 输出的三角模型
	surface.process(outMesh);
	
	/****************展示********************/
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("surface"));
	viewer->addPolygonMesh(*cloud_obj_mesh, "cloud_obj_mesh");
	viewer->setRepresentationToWireframeForAllActors();		// mesh模型以线框图模式显示

	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer0(new pcl::visualization::PCLVisualizer("surface"));
	viewer0->addPolygonMesh(outMesh, "outMesh");
	viewer0->setRepresentationToWireframeForAllActors();		// mesh模型以线框图模式显示

	while (!viewer->wasStopped() || !viewer0->wasStopped())
	{
		viewer->spinOnce(100);
		viewer0->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}

	return (0);

}

4.结果展示

原始数据(全为多边形,并不是三角面片)

剖分结果(可以看出结果均为三角面片)

### Delaunay三角网生成算法的图形化解释 Delaunay三角剖分是一种广泛应用于计算几何中的方,它具有独特的特性——即任何顶点都不位于其他任意三个顶点所形成的圆内部[^1]。这种特性的直观理解可以通过逐步构建过程来展示。 #### 图形化步骤解析 1. **初始点集准备** 首先定义一组离散点集合 \( P \),这些点将在平面上形成Delaunay三角剖分的基础。假设我们有若干随机分布的二维坐标点。 2. **超级三角形引入** 创建一个覆盖整个点集的大三角形(通常称为“超级三角形”),该三角形应足够大以包围所有的输入点。此操作是为了便于后续增量插入的应用[^5]。 3. **逐点插入与更新** 对于每一个新加入的点: - 找到包含当前点的所有现有三角形。 - 删除那些被新点破坏空外接圆条件的边。 - 将新的点连接至删除区域边界上的所有可见顶点,从而创建一系列新的合三角形[^4]。 4. **移除虚拟贡献者** 完成全部点的插入之后,最后一步是从最终结果中剔除由最初设置的超级三角形引发的相关结构部分。 以下是利用Python实现上述逻辑的一个简单例子: ```python import matplotlib.pyplot as plt from scipy.spatial import Delaunay import numpy as np points = np.array([ [0, 0], [1, 4], [2, 3], [4, 1], [1, 1], [2, 2], [3, 2], [3, 3] ]) tri = Delaunay(points) plt.triplot(points[:,0], points[:,1], tri.simplices) plt.plot(points[:,0], points[:,1], 'o') for j, p in enumerate(points): plt.text(p[0]-0.03, p[1]+0.03, j, ha='right') circumcenters = [] for simplex in tri.simplices: pts = points[simplex] center = (sum(pts[:,0])/3, sum(pts[:,1])/3) circumcenters.append(center) circumcenters = np.array(circumcenters) plt.plot(circumcenters[:,0], circumcenters[:,1],'*r') plt.show() ``` 以上代码片段展示了如何使用`scipy.spatial.Delaunay`模块来进行标准的Delaunay三角划分,并通过matplotlib库将其可视化出来。 ### 结论 综上所述,借助图形演示可以帮助更深入地理解和验证Delaunay三角剖分的过程及其核心原则。这种方不仅限于理论探讨,在实际应用如地形分析、有限元网格生成等领域也极为重要[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值