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.结果展示
原始数据(全为多边形,并不是三角面片)
剖分结果(可以看出结果均为三角面片)