当前位置: 首页 > news >正文

PCL 生成三棱锥点云

目录

  • 一、算法原理
  • 二、代码实现
  • 三、结果展示

一、算法原理

针对正三棱锥(四面体)表面均匀点云的生成,采用基于重心坐标的随机采样方法。对于任意三角形,其顶点为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\}{ξ10,ξ20,ξ1+ξ21}上的均匀分布。实际计算时,首先生成两个独立的均匀随机变量U , V ∼ U [ 0 , 1 ] U, V \sim \mathcal{U}[0,1]U,VU[0,1],仅当U + V ≤ 1 U+V \le 1U+V1时接受该数对;否则拒绝并重新采样。这一拒绝机制确保了点集在三角形区域内呈均匀分布。
将该过程分别应用于三棱锥的四个三角面——底面与三个侧面——即可得到该多面体表面的稠密点云。各面独立采样,互不影响,整体点云在表面积上具有无偏均匀性。

二、代码实现

#include<vector>#include<random>#include<iostream>#include<pcl/point_types.h>#include<pcl/point_cloud.h>#include<pcl/io/pcd_io.h>#include<pcl/visualization/pcl_visualizer.h>// 生成三棱锥点云pcl::PointCloud<pcl::PointXYZ>::PtrgeneratePyramidCloud(){pcl::PointCloud<pcl::PointXYZ>::Ptrcloud(newpcl::PointCloud<pcl::PointXYZ>);// 定义三棱锥的四个顶点std::vector<pcl::PointXYZ>vertices={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_distribution<>dis(0.0,1.0);// 生成底面三角形内部点for(inti=0;i<20000;++i){floatr1=dis(gen);floatr2=dis(gen);if(r1+r2<=1.0f){pcl::PointXYZ p;p.x=(1-r1-r2)*vertices[0].x+r1*vertices[1].x+r2*vertices[2].x;p.y=(1-r1-r2)*vertices[0].y+r1*vertices[1].y+r2*vertices[2].y;p.z=0.0f;cloud->points.push_back(p);}else{i--;// 重新生成}}// 生成三个侧面的点for(intface=0;face<3;++face){intv1=face;intv2=(face+1)%3;intv3=3;// 顶点for(inti=0;i<20000;++i){floatr1=dis(gen);floatr2=dis(gen);if(r1+r2<=1.0f){pcl::PointXYZ p;p.x=(1-r1-r2)*vertices[v1].x+r1*vertices[v2].x+r2*vertices[v3].x;p.y=(1-r1-r2)*vertices[v1].y+r1*vertices[v2].y+r2*vertices[v3].y;p.z=(1-r1-r2)*vertices[v1].z+r1*vertices[v2].z+r2*vertices[v3].z;cloud->points.push_back(p);}else{i--;}}}cloud->width=cloud->points.size();cloud->height=1;cloud->is_dense=true;returncloud;}intmain(){// 生成模拟三棱锥点云std::cout<<"生成三棱锥点云..."<<std::endl;pcl::PointCloud<pcl::PointXYZ>::Ptr pyramid_cloud=generatePyramidCloud();std::cout<<"点云数量: "<<pyramid_cloud->size()<<" 个点"<<std::endl;// 保存模拟点云pcl::io::savePCDFileBinary("pyramid_cloud.pcd",*pyramid_cloud);std::cout<<"已保存模拟点云到: pyramid_cloud.pcd"<<std::endl;// 可视化pcl::visualization::PCLVisualizerviewer("Pyramid");viewer.setBackgroundColor(0.1,0.1,0.1);// 添加原始点云pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>cloud_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;}

三、结果展示

http://www.gsyq.cn/news/1527780.html

相关文章:

  • 从唐康林老师的NX8.5/NX9.0建模教程里,我总结出这5个新手最易踩的坑(附避坑指南)
  • 终极音乐播放方案:一站式解决你的多平台音乐管理痛点
  • 别再盲目修改变量名了!解决Simulink中Matlab Function的Size mismatch报错,关键在这步属性设置
  • 2026年郑州名酒回收市场现状与选购指南:正规渠道与高价变现的底层逻辑 - 优质品牌商家
  • STC8H单片机驱动三相无刷电机:从开源项目到自制PCB的完整避坑指南(附EC11编码器调速)
  • LLM数值预测的非自回归解码技术解析
  • 极小超曲面构造:等参叶理论与广义旋转方法
  • 攻克Jenkins Pipeline难题:gh_mirrors/je/jenkins-library自定义错误处理与调试指南
  • 2026年6月贵州比较好的贝雷桥定制厂家推荐,钢便桥/直角方管/T型钢/Q355D方矩管/低温方矩管,贝雷桥定制厂家推荐 - 品牌推荐师
  • 避开这3个坑!用ArcGIS提取剖面图时,你的高程值可能一直不对
  • 避坑指南:用STM32 HAL库驱动DS3231,这几个I2C时序和初始化细节别踩雷
  • VISTA-9B实战项目:构建智能GUI测试自动化系统
  • 地下结构抗震分析避坑指南:ABAQUS粘弹性边界反力处理的3个常见错误与修正
  • ONVIF协议调时间踩坑记:海康时区设不上、大华有Bug、宇视XML还不同?
  • 三菱FX5U网络通信避坑指南:从GX Works3设置到SMLP协议调试全流程复盘
  • 2026年宝鸡衣柜橱柜定制市场深度观察:哪些品牌值得关注? - 优质品牌商家
  • STM32F103C8T6的PC14/PC15引脚,除了接晶振还能干啥?一个硬件工程师的血泪教训
  • 保姆级教程:用一条带参数的setup命令绕过Oracle 12c安装的OS检查错误
  • Chaos Client 源码解析:深入理解 Go HTTP 客户端与 API 通信机制
  • FPGA开发避坑指南:当ZYNQ的DDS输出遇到AN108 ADDA模块,有符号数转无符号数这个坑你踩过吗?
  • 别再只盯着Accuracy了!手把手教你用ENVI Deep Learning正确评估遥感分类模型(附H5文件解读指南)
  • 从PHY到MAC:一次由时钟频偏引发的硬件调试“悬案”全记录
  • 避开这些坑,你的SCI论文录用率翻倍:从投稿到Proof的完整避雷指南
  • StegaStamp 入门指南:5分钟学会在图像中隐藏和提取秘密信息
  • 2026年成都高考全日制学校怎么选?——基于师资、管理、提分实效的横向分析 - 优质品牌商家
  • 全模态检索技术:OmniRet模型架构与实战应用
  • 避坑指南:MySQL 8.0.33安装后你可能会遇到的5个问题及解决方法
  • Rufus终极指南:Windows 11 LTSC 2024版绕过在线账户的完整解决方案
  • 华为GPON OLT上那条display alarm history all命令,到底该怎么用?
  • 从接线到诊断:倍福EK1100耦合器上手实操全记录,附常见故障灯排查指南