
目录一、算法原理二、代码实现三、结果展示一、算法原理针对正三棱锥四面体表面均匀点云的生成采用基于重心坐标的随机采样方法。对于任意三角形其顶点为A , B , C A,B,CA,B,C随机点P PP由如下凸组合定义P ( 1 − ξ 1 − ξ 2 ) A ξ 1 B ξ 2 C P(1 - \xi_1 - \xi_2)\,\mathbf{A} \xi_1\,\mathbf{B} \xi_2\,\mathbf{C}P(1−ξ1−ξ2)Aξ1Bξ2C其中ξ 1 , ξ 2 \xi_1, \xi_2ξ1,ξ2服从标准二维单纯形{ ξ 1 ≥ 0 , ξ 2 ≥ 0 , ξ 1 ξ 2 ≤ 1 } \{\xi_1 \ge 0,\; \xi_2 \ge 0,\; \xi_1\xi_2 \le 1\}{ξ1≥0,ξ2≥0,ξ1ξ2≤1}上的均匀分布。实际计算时首先生成两个独立的均匀随机变量U , V ∼ U [ 0 , 1 ] U, V \sim \mathcal{U}[0,1]U,V∼U[0,1]仅当U V ≤ 1 UV \le 1UV≤1时接受该数对否则拒绝并重新采样。这一拒绝机制确保了点集在三角形区域内呈均匀分布。将该过程分别应用于三棱锥的四个三角面——底面与三个侧面——即可得到该多面体表面的稠密点云。各面独立采样互不影响整体点云在表面积上具有无偏均匀性。二、代码实现#includevector#includerandom#includeiostream#includepcl/point_types.h#includepcl/point_cloud.h#includepcl/io/pcd_io.h#includepcl/visualization/pcl_visualizer.h// 生成三棱锥点云pcl::PointCloudpcl::PointXYZ::PtrgeneratePyramidCloud(){pcl::PointCloudpcl::PointXYZ::Ptrcloud(newpcl::PointCloudpcl::PointXYZ);// 定义三棱锥的四个顶点std::vectorpcl::PointXYZvertices{pcl::PointXYZ(0.0f,0.0f,0.0f),// 底面三角形顶点1pcl::PointXYZ(1.0f,0.0f,0.0f),// 底面三角形顶点2pcl::PointXYZ(0.5f,0.866f,0.0f),// 底面三角形顶点3pcl::PointXYZ(0.5f,0.288f,1.0f)// 顶点};// 在三个面上生成随机点std::random_device rd;std::mt19937gen(rd());std::uniform_real_distributiondis(0.0,1.0);// 生成底面三角形内部点for(inti0;i20000;i){floatr1dis(gen);floatr2dis(gen);if(r1r21.0f){pcl::PointXYZ p;p.x(1-r1-r2)*vertices[0].xr1*vertices[1].xr2*vertices[2].x;p.y(1-r1-r2)*vertices[0].yr1*vertices[1].yr2*vertices[2].y;p.z0.0f;cloud-points.push_back(p);}else{i--;// 重新生成}}// 生成三个侧面的点for(intface0;face3;face){intv1face;intv2(face1)%3;intv33;// 顶点for(inti0;i20000;i){floatr1dis(gen);floatr2dis(gen);if(r1r21.0f){pcl::PointXYZ p;p.x(1-r1-r2)*vertices[v1].xr1*vertices[v2].xr2*vertices[v3].x;p.y(1-r1-r2)*vertices[v1].yr1*vertices[v2].yr2*vertices[v3].y;p.z(1-r1-r2)*vertices[v1].zr1*vertices[v2].zr2*vertices[v3].z;cloud-points.push_back(p);}else{i--;}}}cloud-widthcloud-points.size();cloud-height1;cloud-is_densetrue;returncloud;}intmain(){// 生成模拟三棱锥点云std::cout生成三棱锥点云...std::endl;pcl::PointCloudpcl::PointXYZ::Ptr pyramid_cloudgeneratePyramidCloud();std::cout点云数量: pyramid_cloud-size() 个点std::endl;// 保存模拟点云pcl::io::savePCDFileBinary(pyramid_cloud.pcd,*pyramid_cloud);std::cout已保存模拟点云到: pyramid_cloud.pcdstd::endl;// 可视化pcl::visualization::PCLVisualizerviewer(Pyramid);viewer.setBackgroundColor(0.1,0.1,0.1);// 添加原始点云pcl::visualization::PointCloudColorHandlerCustompcl::PointXYZcloud_color(pyramid_cloud,100,100,100);viewer.addPointCloud(pyramid_cloud,cloud_color,pyramid_cloud);viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,1,pyramid_cloud);std::cout\n按q退出可视化窗口...std::endl;viewer.spin();return0;}三、结果展示