空间平面旋转与xoy平行

法向量

空间平面ax+by+cz+d=0的其中一个法向量(a,b,c),法向量垂直于空间平面。目标平面平行于xoy的平面为0x+0y+cz+d=0;其中一个法向量为(0,0,c),c可以为不为0的任意值,取(0,0,1),目标平面的的法向量垂直于xoy平面

向量叉乘点乘

两个向量的点乘叉乘的区别
点乘计算两向量的投影关系并返回标量,反映两向量方向相似性
叉乘则生成垂直于原向量平面的新向量并反映空间结构关系
点乘获取旋转角度
叉乘获取旋转轴

// 平面生成
void generatePlanePointCloud(float a, float b, float c, float d,pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud) 
{for (int i = 0; i < 10000; i++){double x = rand() % 500;double y = rand() % 500;double z = (a * x + b * y + d) / (0 - c);//假设平面方程类型 ax+by+cz+d=0Eigen::Vector3f point(x, y, z);cloud->points.emplace_back(point.x(), point.y(), point.z());}
}
int main() 
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());// 定义平面 ax + by + cz + d = 0 的参数float a = -2.0f, b = -9.0f, c = 8.0f, d = 100.0f;// 调用函数生成平面点云generatePlanePointCloud(a, b, c, d, cloud);//点云几何中心 可平移点云到坐标原点Eigen::Vector4f centroid;					pcl::compute3DCentroid(*cloud, centroid);Eigen::Matrix4f transform_matrix = Eigen::Matrix4f::Identity();Eigen::Vector3f translationxyz(-centroid(0), -centroid(1), -centroid(2));transform_matrix.block<3, 1>(0, 3) = translationxyz;pcl::PointCloud<pcl::PointXYZ>::Ptr ocloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::transformPointCloud(*cloud, *ocloud, transform_matrix);// 平面法向量和目标平面法向量Eigen::Vector3f v1(a, b, c), v2(0, 0, 1);// 点乘获取旋转夹角float RotateRad = pcl::getAngle3D(v1, v2);// 叉乘获取旋转轴 旋转轴需要单位化Eigen::Vector3f RotateAxis = v1.cross(v2).normalized();// 点乘获取旋转夹角float RotateRad1 = RotateRad;float angle = acos(v1.normalized().dot(v2.normalized()));// 生成放射变换单位矩阵4x4 Affine3f不是matrix但是有matrix函数Eigen::Affine3f rotation = Eigen::Affine3f::Identity();// 将旋转轴和旋转角添加到仿射矩阵rotation.rotate(Eigen::AngleAxisf(RotateRad1, RotateAxis));// 生成单位旋转矩阵3x3Eigen::Matrix3f rotation_matrix = Eigen::Matrix3f::Identity();// 生成旋转向量Eigen::AngleAxisf rotation_vector(RotateRad, RotateAxis); // 注意:旋转轴必须为单位向量rotation_matrix = rotation_vector.toRotationMatrix();// 使用罗德里格斯公式得到旋转矩阵// 初始化平移向量(此处为0)Eigen::Vector3f translation(0, 0, 0);// 创建4x4变换矩阵Eigen::Matrix4f transform_matrix1 = Eigen::Matrix4f::Identity();transform_matrix1.block<3, 3>(0, 0) = rotation_matrix; // 设置旋转部分transform_matrix1.block<3, 1>(0, 3) = translation;     // 设置平移部分pcl::PointCloud<pcl::PointXYZ>::Ptr xcloud(new pcl::PointCloud<pcl::PointXYZ>);// 平面点云进行仿射变换pcl::transformPointCloud(*ocloud, *xcloud, transform_matrix1);pcl::PointCloud<pcl::PointXYZ>::Ptr ycloud(new pcl::PointCloud<pcl::PointXYZ>);// 平面点云进行仿射变换pcl::transformPointCloud(*cloud, *ycloud, rotation);boost::shared_ptr<pcl::visualization::PCLVisualizer> view(new pcl::visualization::PCLVisualizer("3D Viewer"));pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> src_h(xcloud, 0, 255, 0);//定义颜色 pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> src_h1(ycloud, 0, 0, 255);//定义颜色 pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> src_h2(ocloud, 0, 255, 255);//定义颜色 view->addCoordinateSystem(500.0,0,0,0); // 添加坐标轴,大小为500.0view->addPointCloud<pcl::PointXYZ>(cloud, "cloud_in");view->addPointCloud<pcl::PointXYZ>(xcloud, src_h, "clound_xuanzhuan");view->addPointCloud<pcl::PointXYZ>(ycloud, src_h1, "xuanzhuan1");//view->addPointCloud<pcl::PointXYZ>(ocloud, src_h2, "xuanzhuan2");view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "cloud_in");while (!view->wasStopped()){view->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}return 0;
}

点云图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917600.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917600.shtml
英文地址,请注明出处:http://en.pswp.cn/news/917600.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

odoo reportbro 拖拽式报表设计

报表设计以及下载 在实际业务中应用非常的广泛且频繁。odoo 本身也具有报表设计功能&#xff0c;但都是代码模式。且需要开发人员定制化开发&#xff0c;耗费成本高 所以引入reportbro报表设计就非常的简单快捷。低代码模式 以下以销售报表为例进行演示 报表字段配置报表界面设…

数字信号处理_编程实例1

stem([1,2,3]) 一、初始设置 %% 初始设置 % 清空工作空间&#xff0c;关闭无关页面 clc,clear,close all; % 绘图变量 font_size 12; %全局基础字体大小 axis_size 10; %坐标轴刻度标签字体大小 line_width 2; %绘图线条宽度 legend_size 10.5; %图例字体大小 marker_siz…

Docker 安装部署 OceanBase

1.拉取镜像 docker pull oceanbase/oceanbase-ce:latest2.启动oceanbase容器 docker run -p 2881:2881 --name oceanbase-ce -e MINI_MODE0 -d quay.io/oceanbase/oceanbase-ce3.查看oceanbase初始化的日志信息 docker logs oceanbase-ce4.进入oceanbase容器 docker exec -it o…

【华为机试】685. 冗余连接 II

文章目录685. 冗余连接 II题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解题思路算法分析核心思想算法策略算法对比问题分类流程图并查集环检测流程入度统计与候选边选择情况分析决策树完整算法流程复杂度分析时间复杂度空间复杂度关键实现技巧1. 并查集优化2…

Redis之Hash和List类型常用命令

Redis之Hash和List类型常用命令一、Hash类型详解1. Hash类型的特点2. 常用命令及示例&#xff08;1&#xff09;设置字段值&#xff08;2&#xff09;获取字段值&#xff08;3&#xff09;删除字段&#xff08;4&#xff09;其他常用命令3. 应用场景二、List类型详解1. List类型…

【测试】⾃动化测试概念篇

本节⽬标&#xff1a;⾃动化测试Web⾃动化测试selenium1. ⾃动化1.1 ⾃动化概念⾃动化在⽣活中处处可⻅&#xff0c;⾃动的代替⼈的⾏为完成操作。⾃动洒⽔机&#xff0c;主要通上⽔就可以⾃动化洒⽔并且可以⾃动的旋转。⾃动洗⼿液&#xff0c;免去了⼿动挤压可以⾃动感应出洗…

Java中给List<T> 对象集合去重

Java中给List 对象集合去重List<Student> getStudentList studentMapper.getStudentList();List<Student> distinctInsurance distinctByField(getStudentList, Student::getCertNo);public static <T> List<T> distinctByField(List<T> list…

最小二乘法MSE

最小二乘法MSEx1x2x3x4x5x6x7x8x0y014805-29-31339-41064-14-2-1481-114-1-65-123-32-21305-23105114-81126-15-15-8-157-4-1221-39511-10-243-9-671-87-1404-35101371422-3-7-2-80-6-5-91-3091前景知识: 矩阵相关公式y(339−11430126−395−87422−309)y\begin{pmatrix} 339&a…

Pixel 4D 3.4.4.0 | 支持丰富的壁纸资源,高清画质,高度的个性化设置能力,智能推荐功能

Pixel 4D是一款功能强大且用户体验良好的动态壁纸应用。它提供了丰富的壁纸资源和高清画质&#xff0c;让用户可以轻松找到自己喜欢的壁纸。此外&#xff0c;该应用还具备高度的个性化设置能力&#xff0c;允许用户根据自己的喜好调整壁纸效果。智能推荐功能则能帮助用户发现更…

<PhotoShop><JavaScript><脚本>基于JavaScript,利用脚本实现PS软件批量替换图片,并转换为智能对象?

前言 PhotoShop软件支持JavaScript脚本,来扩展软件的功能,官方本身也提供了一些常用脚本,如图像处理等,同时也支持自定义的JavaScript脚本。 环境配置 系统:windows 平台:visual studio code 语言:JavaScript 软件:PhotoShop 2022 版本:23.2.1 概述 本文利用Java…

【Linux】System V - 基于建造者模式的信号量

目录 信号量和P、V原语 信号量集结构体 信号量操作接口 semget semctl semop 封装Sem 关于建造者模式 信号量和P、V原语 信号量和 P、V 原语由 Dijkstra &#xff08;迪杰斯特拉&#xff09;提出 信号量值含义 S>0: S 表⽰可⽤资源的个数 S0: 表⽰⽆可⽤资源&a…

机器学习(11):岭回归Ridge

岭回归是失损函数通过添加所有权重的平方和的乘积(L2)来惩罚模型的复杂度。均方差除以2是因为方便求导&#xff0c;w_j指所有的权重系数, λ指惩罚型系数&#xff0c;又叫正则项力度特点:岭回归不会将权重压缩到零&#xff0c;这意味着所有特征都会保留在模型中&#xff0c;但它…

调整Idea缓存目录,释放C盘空间

本文使用 Idea2024 Idea 会将一些配置默认缓存在C盘&#xff0c;使用久了会占用大量空间&#xff08;本人的Idea占用了将近5个G&#xff0c;以至于不得不进行迁移&#xff09; 缓存目录主要涉及以下四个目录&#xff0c;四个目录可以分为两组&#xff0c;每组目录必须一起调整 …

手搓栅格工具-山体阴影

一、概述 山体阴影工具通过为栅格中的每个像元确定照明度&#xff0c;来获取表面的假定照明度。 通过设置假定光源的位置并计算每个像元相对于相邻像元的照明度值来实现此目的。 它可以显著增强用于分析或图形显示的表面的可视化效果&#xff0c;尤其是在使用透明度时。 默认情…

Censtos docker安装方法

#设置防火墙 systemctl stop firewalld.service setenforce 0 #安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 #yum-utils&#xff1a;提供了 yum-config-manager 工具。 #device mapper&#xff1a; 是Linux内核中支持逻辑卷管理的通用设备映射机制…

单片机51 day46

单片机 一&#xff1a;基础概念 一&#xff1a;单片机最小系统 单片机&#xff1a;电源时钟&#xff08;晶振&#xff09;复位 //实现的最小组件 电源&#xff1a;5V直流 时钟(晶振)&#xff1a;决定系统运行的速率 一般12M&#xff08;不超过50M&#xff09;&#xff0c…

【无标题】解锁未来无线网络的无限可能——Mesh自组网设备

在科技迅猛发展的今天&#xff0c;无线网络已经成为了现代生活不可或缺的一部分。无论是在家庭中娱乐观看视频、在线游戏&#xff0c;还是在企业中进行办公、远程协作&#xff0c;网络的稳定性和覆盖范围都直接影响着我们的使用体验。传统的Wi-Fi网络在面临多设备同时连接或大面…

Libevent(5)之使用教程(4)工具

Libevent(5)之使用教程(4)工具函数 Author: Once Day Date: 2025年8月3日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 本文档翻译于&#xff1a;Fast portable non-blo…

Linux指令(3):

1. cal指令&#xff1a;我们的cal指令有日历的意思看上面&#xff0c;我们输入一个cal指令&#xff0c;可以查看当前月的日历&#xff0c;我们给cal指令后面加上 - 3&#xff0c;他就会显示这个月为中间的三个月的日历&#xff0c;但是-4 不行&#xff0c;-5 也不行。只能 - 3。…

MLS平滑滤波

1.前言 最近在学习&#xff0c;因此查阅相关资料&#xff0c;该怎么表述感觉有些困难 2.代码 2.1代码1 使用全局坐标系 参考&#xff1a;python点云移动最小二乘法(Moving Least Squares)平滑_移动最小二乘法python-CSDN博客 def Moving_Least_Squares_Smoothing_v1_expla…