空間平面旋轉與xoy平行

空間平面旋轉與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…