一、凸包包围盒
凸包包围比其他包围体更紧密地包围原物体,创建的层次树也就有更少的节点,求交检测时就会减少更多的冗余计算,但相互间的求交运算较为复杂
二、代码部分
注:测试代码均使用PclSharp1.12.0库
/// <summary>
/// 凸包计算
/// </summary>
/// <param name="inCloud">输入点云</param>
/// <param name="outCloud">输出所有凸包多边形的顶点点云</param>
/// <param name="vol">输出体积值</param>
/// <returns>输出所有凸包多边形的顶点的下标</returns>
public static PolygonMesh ConvexHull_Mesh(PointCloudOfXYZ inCloud, out PointCloudOfXYZ outCloud,out double vol)
{
// polygons保存的是所有凸包多边形的顶点在surface_hull中的下标
PolygonMesh mesh = new PolygonMesh();
// surface_hull是所有凸包多边形的顶点
PointCloudOfXYZ surface_hull = new PointCloudOfXYZ();
using (ConvexHullOfXYZ convex_hull = new ConvexHullOfXYZ())
{
convex_hull.SetInputCloud(inCloud);
convex_hull.Dimension = 3; // 设置凸包维度
//调用qhull库计算凸多边形的总面积和总体积
convex_hull.ComputeAreaVolume = true;
convex_hull.Reconstruct(mesh);
convex_hull.Reconstruct(surface_hull);
// 凸包点云存放在surface_hull中,polygons中的Vertices存放一组点的索引,索引是surface_hull中的点对应的索引
//convex_hull.Reconstruct(surface_hull,mesh);
// 获取凸包的总面积
double convex_area = convex_hull.TotalArea;
//获取凸包体积
vol = convex_hull.TotalVolume;
}
outCloud = surface_hull;
return mesh;
}
/// <summary>
/// 显示凸包
/// </summary>
/// <param name="cloud"></param>
/// <param name="mesh"></param>
/// <param name="label"></param>
/// <param name="field"></param>
public void ShowPointCloud_ConvexHull(PointCloudOfXYZ cloud, PolygonMesh mesh, string label = "", string field = "z")
{
try
{
this.Invoke(new Action(() =>
{
ShowLogInfo($"{label}--");
cloud_current = Filters.RemoveNaNFromPointCloud(cloud);
visualizerWinForm.visualizer.RemoveAllShapes();
visualizerWinForm.visualizer.RemoveAllPointClouds();
visualizerWinForm.visualizer.SetBackgroundColor(0.3f, 0.3f, 0.3f);
//PointCloudShoWinForm.visualizer.AddPointCloud(pointCloud);
visualizerWinForm.visualizer.AddPointCloudColor(cloud_current, field);
//设置点的大小
visualizerWinForm.visualizer.SetPointCloudRenderingProperties(RenderingProperties.PointSize, 2);
visualizerWinForm.visualizer.AddCoordinateSystem(1.0);
//添加凸包网格
visualizer.AddPolylineFromPolygonMesh(mesh);
SetCamera(cloud);
}));
//日志信息显示点云数据
ShowLogInfo($"点个数----{cloud.Count}");
}
catch (Exception ex)
{
MessageBox.Show($"{ex.Message}");
}
}
三、结果显示