【三维向量旋转】基于Matlab的三维坐标旋转

一、问题描述

若空间中存在三个点A,B,C,其中A点是不动点,B点是当前方向向量上的一个点,C是目标方向上的一个点。如果要让AB向量沿着BC方向进行旋转,使得AB最终旋转到AC。这个过程就是三维向量的旋转过程。我们关注的是这个过程,即确定好A,B,C三点后,指定任意的旋转角度,可以得到B点旋转到C点过程中的对应轨迹点

在这里插入图片描述

二、求解思路

第一步:求解ABC 平面的法向量

要求三维屏幕的法向量,你可以使用这三个点来计算。假设这三个点分别为 A,B,C

法向量可以通过计算两个向量的叉积来获得。在这种情况下,可以选择两个向量为AB,AC,然后计算这两个向量的叉积来得到法向量。

具体步骤如下:

在这里插入图片描述
下面是一个示例 MATLAB 代码,演示如何计算三维空间中由三个点定义的平面的法向量:

% 定义三个屏幕上的点
A = [1, 2, 3]; % 举例点 A
B = [4, 5, 6]; % 举例点 B
C = [7, 8, 9]; % 举例点 C

% 计算向量 AB 和 AC
AB = B - A;
AC = C - A;

% 计算法向量
n = cross(AB, AC);

disp('屏幕的法向量 n:');
disp(n);

这段代码将计算由三个点定义的平面的法向量。你可以替换示例点的实际值,并运行代码来获得平面的法向量。
在这里插入图片描述

第二步求解旋转后的向量

当涉及三维空间向量沿特定方向旋转时,可以使用旋转矩阵来实现这一点。假设我们有一个三维向量 v= [x, y, z],我们希望将其绕一个单位向量u= [u_x, u_y, u_z]所表示的方向进行旋转。以下是一个基本的步骤:

  1. 计算旋转矩阵:首先需要计算一个旋转矩阵,该矩阵描述了如何将向量旋转到新的方向。这个旋转矩阵通常是一个3x3的矩阵。

  2. 进行旋转:将向量 v 与旋转矩阵相乘,即可得到旋转后的向量。
    在这里插入图片描述

三、代码实现

clc
close all
clear all
dbstop if error


% 定义三个屏幕上的点
A = [0, 0, 0]; % 举例点 A 
B = [0, 1, 0]; % 举例点 B 
C = [0, 0, 1]; % 举例点 C 

% 计算向量 AB 和 AC
AB = B - A;
AC = C - A;

% 计算法向量
n = cross(AB, AC);

disp('屏幕的法向量 n:');
disp(n);


figure
view(3)
plot3([A(1)],[A(2)],[A(3)],'ro','DisplayName','A点')
hold on
% 
plot3([B(1)],[B(2)],[B(3)],'go','DisplayName','B点')

hold on
plot3([C(1)],[C(2)],[C(3)],'bo','DisplayName','C点')

plot3([0 n(1)],[0 n(2)],[0 n(3)],'r','DisplayName','ABC平面的法向量')

grid on

xlabel('x')
ylabel('y')
zlabel('z')
legend
xlim([-2 2])
ylim([-2 2])
zlim([-2 2])

v=B-A;

u = n;          % 旋转轴(单位向量)
theta = pi *0.25;         % 旋转角度(45度)

% 计算旋转后的向量
v_rot = round(rotate_vector(v, u, theta));

% 显示结果
disp('旋转后的向量:');
disp(v_rot);

figure
view(3)
plot3([0 v(1)],[0 v(2)],[0 v(3)],'r','DisplayName','旋转前')
hold on
plot3([0 u(1)],[0 u(2)],[0 u(3)],'b','LineWidth',2,'DisplayName','法向量')
hold on
plot3([0 v_rot(1)],[0 v_rot(2)],[0 v_rot(3)],'g','DisplayName','旋转后')
grid on
axis equal

xlabel('x')
ylabel('y')
zlabel('z')
legend

hold on

C=v_rot(:)+A(:);
B=v(:)+A(:);
xlim([-2 2])
ylim([-2 2])
zlim([-2 2])
% figure
view(3)
plot3([A(1)],[A(2)],[A(3)],'ro','DisplayName','A')
hold on
plot3([B(1)],[B(2)],[B(3)],'go','DisplayName','B')
hold on
plot3([C(1)],[C(2)],[C(3)],'bo','DisplayName','B’')
grid on
legend

四、结果分享

擅长matlab,python 各类算法的实现 长期提供①源码分享②辅导答疑③项目定制 欢迎咨询

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【音频特征提取】傅里叶变换算法源码学习记录

目录 背景快速理解FFT(快速傅里叶变换)IFFT(逆傅里叶变换)STFT(短时傅里叶变换) 代码实现FFT源代码IFFT源代码FFT、IFFT自己实验STFT源代码STFT自己实验 总结 背景 最近用到了相关操作提取音频信号特征&am…

松下的台灯值得入手吗?书客|飞利浦护眼台灯真实测评PK

在追求高效阅读与舒适生活的今天,一盏好的台灯不仅是照明的工具,更是呵护双眼的伴侣。它不仅能够提供额外的光线,还能减少眼睛疲劳,提高我们的工作和学习效率。随着市场的不断发展,护眼台灯品牌款式愈发丰富。因此我们…

MYSQL 四、mysql进阶 8(索引优化与查询优化)

都有哪些维度可以进行数据库调优?简言之: 索引失效、没有充分利用到索引——建立索引关联查询太多JOIN(设计缺陷或不得已的需求)——SQL优化服务器调优及各个参数设置(缓冲、线程数等)——调整my.cnf数据过…

【C++】C++11(三)

我们在C11(2)中已经很好的解释了右值引用,这次来看看右值引用剩余的一些话题:可变参数包与emplace_back。 目录 可变参数模板:可变参数的sizeof:可变参数的展开:递归函数方式展开参数包&#x…

通过Arcgis从逐月平均气温数据中提取并计算年平均气温

通过Arcgis快速将逐月平均气温数据生成年平均气温数据。本次用2020年逐月平均气温数据操作说明。 一、准备工作 (1)准备Arcmap桌面软件; (2)准备2020年逐月平均气温数据(NC格式)、范围图层数据&…

k8s 部署RuoYi-Vue-Plus之server部署

1.先使用项目编排构建镜像, 修改prod使用的mysql, redis地址 获取运行的服务 kubectl get svc -n ruoyi对应连接修改 然后运行打包package命令, 生成jar包, 再打包为docker容器, 上传到所有节点上, 也可以上传到个人私有仓库 2.部署server-deploy.yaml 镜像名自行修改, apiV…

你知道的和你不知道的DOM操作技巧

你知道的和你不知道的DOM操作技巧 亲爱的前端小伙伴们,今天我们来聊聊那些你可能知道或者不知道的DOM操作技巧。作为一名前端开发者,如果你还在为DOM操作头疼,那么这篇文章绝对能让你茅塞顿开。让我们一起来探索一下DOM的奥秘吧!…

【开源合规】开源许可证风险场景详细解读

文章目录 前言关于BlackDuck许可证风险对比图弱互惠型许可证举个例子具体示例LGPL系列LGPL-2.0-onlyLGPL-2.0-or-laterLGPL-2.1-onlyLGPL-2.1-or-laterLGPL-3.0-onlyLGPL-3.0-or-laterMPL系列MPL-1.0MPL-1.1MPL-2.0EPL系列EPL-1.0EPL-2.0互惠型许可证GPL系列GPL-1.0GPL-2.0GPL-…

Mac系统清理工具:您的数字生活杂务处理师

有没有觉得您的Mac有时候像是需要一个好的春季大扫除一样?随着我们不断使用电脑,各种不需要的文件、老旧的数据和忘记的安装包就像家里的灰尘一样慢慢积累。幸运的是,有了一些出色的Mac系统清理工具,我们可以轻松将这些数字灰尘拂…

Java中实现二维数组(矩阵)的转置

在矩阵运算中,矩阵的转置是一个基本操作,即将矩阵的行变成列,列变成行。在Java中,我们可以通过编写一个方法来实现二维数组的转置。下面,我将详细介绍如何在Java中完成这一任务,并提供完整的代码示例。 编…

【Linux】命令执行的判断依据:;,,||

在某些情况下,很多命令我想要一次输入去执行,而不想要分次执行时,该如何是好? 基本上有两个选择, 一个是通过shell脚本脚本去执行,一种则是通过下面的介绍来一次入多个命令。 1.cmd:cmd&#…

AR增强现实汽车装配仿真培训系统开发降低投入费用

随着互联网的无处不在,AR增强现实技术正逐步融入我们生活的每一个角落。深圳华锐视点作为一家引领行业潮流的AR内容开发的技术型公司,正以其卓越的技术实力和专业的服务团队,推动着国内AR技术向更加成熟和多元化的方向迈进。 深圳华锐视点提供…

成都晨持绪:抖音电商带货需要交钱吗

在抖音这个充满创意与可能的平台上,电商带货成为了一种新兴而又时尚的职业。然而,伴随着无数的点击与转发,有一个问题始终萦绕在人们心头——抖音电商带货需要交钱吗? 如画卷展开,抖音平台以其独特的算法和庞大的用户基础构建了一…

GDidees CMS v3.9.1 本地文件泄露漏洞(CVE-2023-27179)

前言 CVE-2023-27179 是一个影响 GDidees CMS v3.9.1 及更低版本的任意文件下载漏洞。这个漏洞存在于 /_admin/imgdownload.php 文件中,攻击者可以通过向 filename 参数传递恶意输入来下载服务器上的任意文件。 漏洞的根源在于对用户输入的 filename 参数处理不当…

前后端如何实现非对称加解密-使用RSA为例讲解!

写在最前面,RSA是一种非对称加密算法,使用不同的公钥和私钥进行加密和解密。 下面是使用RSA进行加密和解密的代码示例: 前端:使用CryptoJS进行RSA加密 在前端JavaScript中,使用jsencrypt库来进行RSA加密&#xff1a…

网络安全----防御----防火墙安全策略组网

防火墙组网 要求: 1,DMz区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问。 2,生产区不允许访问互联网,办公区和游客区允许访问互联网 3,办公区设备10.0.…

【AI前沿】深度学习:技术、发展与前沿应用

文章目录 一、深度学习的背景与发展1.1 背景1.2 早期发展1.3 突破性进展1.4 近年发展 二、深度学习的基本概念2.1 神经网络2.2 多层感知器(MLP)2.3 卷积神经网络(CNN)2.4 循环神经网络(RNN)2.5 生成对抗网络…

【C++修行之道】string类练习题

目录 387. 字符串中的第一个唯一字符 125. 验证回文串 917. 仅仅反转字母 415. 字符串相加(重点) 541. 反转字符串 II 387. 字符串中的第一个唯一字符 字符串中的第一个唯一字符 - 力扣(LeetCode) 给定一个字符串 s &#…

【Windows】实现窗口子类化(基于远程线程注入)

目录 前言 原理解释 完整项目 相关文献 文章出处链接:[https://blog.csdn.net/qq_59075481/article/details/140334106] 前言 众所周知,DLL 注入有多种用途,如热修补、日志记录、子类化等。本文重点介绍使用 DLL 注入对窗口进行子类化。…

路径规划之基于二次规划的路径平滑Matlab代码

参考: 自动驾驶决策规划算法第二章第二节(上) 参考线模块_哔哩哔哩_bilibili 自动驾驶决策规划算法第二章第二节(下) 参考线代码实践_哔哩哔哩_bilibili QP函数,二次规划的逻辑 function [smooth_path_x,smooth_path_y] QP(path_x, path_y, w_cost_s…