PclSharp1.12.0--计算凸包ConvexHull包围盒体积

一、凸包包围盒

凸包包围比其他包围体更紧密地包围原物体,创建的层次树也就有更少的节点,求交检测时就会减少更多的冗余计算,但相互间的求交运算较为复杂

二、代码部分

注:测试代码均使用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}");
            }

        }
 

三、结果显示

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

西~风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值