二维空间中的点绕原点的旋转矩阵是怎么来的?(内含视频讲解)

2024-06-07 08:36

本文主要是介绍二维空间中的点绕原点的旋转矩阵是怎么来的?(内含视频讲解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如是我闻: 如果直接看书的话,他会告诉你二维空间中点的旋转变换的定义是这样的。

R ( β ) = [ cos ⁡ ( β ) − sin ⁡ ( β ) sin ⁡ ( β ) cos ⁡ ( β ) ] \mathbf{R}(\beta) = \begin{bmatrix} \cos(\beta) & -\sin(\beta) \\ \sin(\beta) & \cos(\beta) \end{bmatrix} R(β)=[cos(β)sin(β)sin(β)cos(β)]

其中 β \beta β是按逆时针方向测量的旋转角度。

可是为什么是这样的呢?这矩阵是怎么来的呢?

二维空间中围绕原点的旋转矩阵是怎么来的

几何基础

在纸上可以画一下,在平面上有一点 P ( x , y ) P(x, y) P(x,y),你想将这个点围绕原点 O ( 0 , 0 ) O(0, 0) O(0,0)旋转某个角度 β \beta β。旋转是逆时针方向的。旋转后,点 P P P 的新位置称为 P ′ ( x ′ , y ′ ) P'(x', y') P(x,y)

从三角函数出发

考虑点 P P P 初始时与x轴的夹角为 α \alpha α,且 P P P 到原点的距离(即向量 O P OP OP的长度)是 r r r。根据三角函数,原始坐标 x x x y y y 可以表示为:

  • x = r cos ⁡ ( α ) x = r \cos(\alpha) x=rcos(α)
  • y = r sin ⁡ ( α ) y = r \sin(\alpha) y=rsin(α)

当我们逆时针旋转这个点 β \beta β 度后,新的夹角是 α + β \alpha + \beta α+β。因此,旋转后的坐标 x ′ x' x y ′ y' y 可以用新的角度来表示 (这里不明白可以去看直角坐标系与极坐标系的转换):

  • x ′ = r cos ⁡ ( α + β ) x' = r \cos(\alpha + \beta) x=rcos(α+β)
  • y ′ = r sin ⁡ ( α + β ) y' = r \sin(\alpha + \beta) y=rsin(α+β)

利用余弦和正弦的加法公式

我们可以应用余弦和正弦的加法公式来展开这两个表达式:

  • cos ⁡ ( α + β ) = cos ⁡ ( α ) cos ⁡ ( β ) − sin ⁡ ( α ) sin ⁡ ( β ) \cos(\alpha + \beta) = \cos(\alpha)\cos(\beta) - \sin(\alpha)\sin(\beta) cos(α+β)=cos(α)cos(β)sin(α)sin(β)
  • sin ⁡ ( α + β ) = sin ⁡ ( α ) cos ⁡ ( β ) + cos ⁡ ( α ) sin ⁡ ( β ) \sin(\alpha + \beta) = \sin(\alpha)\cos(\beta) + \cos(\alpha)\sin(\beta) sin(α+β)=sin(α)cos(β)+cos(α)sin(β)

将这些代入 x ′ x' x y ′ y' y 的表达式,我们得到:

  • x ′ = r cos ⁡ ( α ) cos ⁡ ( β ) − r sin ⁡ ( α ) sin ⁡ ( β ) x' = r \cos(\alpha)\cos(\beta) - r \sin(\alpha)\sin(\beta) x=rcos(α)cos(β)rsin(α)sin(β)
  • y ′ = r sin ⁡ ( α ) cos ⁡ ( β ) + r cos ⁡ ( α ) sin ⁡ ( β ) y' = r \sin(\alpha)\cos(\beta) + r \cos(\alpha)\sin(\beta) y=rsin(α)cos(β)+rcos(α)sin(β)

既然 x = r cos ⁡ ( α ) x = r \cos(\alpha) x=rcos(α) y = r sin ⁡ ( α ) y = r \sin(\alpha) y=rsin(α),我们可以简化上面的表达式为:

  • x ′ = x cos ⁡ ( β ) − y sin ⁡ ( β ) x' = x \cos(\beta) - y \sin(\beta) x=xcos(β)ysin(β)
  • y ′ = x sin ⁡ ( β ) + y cos ⁡ ( β ) y' = x \sin(\beta) + y \cos(\beta) y=xsin(β)+ycos(β)

这个变换意味着每个点在平面上的新位置是通过将其旧位置从原点旋转 β \beta β度获得的。这种旋转保持了点与原点之间的距离不变(即 r r r是不变的),但是改变了点相对于原始x轴的角度。

向量和矩阵表示

当然有了以上的方程式,我们可以用向量和矩阵表示这个方程组,

给定一个点 P P P 的坐标为 ( x , y ) (x, y) (x,y),我们可以将其表示为列向量:

P = [ x y ] \mathbf{P} = \begin{bmatrix} x \\ y \end{bmatrix} P=[xy]

当这个点逆时针旋转角度 β \beta β 后,新的坐标 P ′ P' P 可以通过以下矩阵运算得到:

P ′ = R ( β ) P \mathbf{P'} = \mathbf{R}(\beta) \mathbf{P} P=R(β)P

其中,旋转矩阵 R ( β ) \mathbf{R}(\beta) R(β)定义为:

R ( β ) = [ cos ⁡ ( β ) − sin ⁡ ( β ) sin ⁡ ( β ) cos ⁡ ( β ) ] \mathbf{R}(\beta) = \begin{bmatrix} \cos(\beta) & -\sin(\beta) \\ \sin(\beta) & \cos(\beta) \end{bmatrix} R(β)=[cos(β)sin(β)sin(β)cos(β)]

计算示例

将旋转矩阵乘以点 P P P 的坐标向量,我们得到:

P ′ = [ cos ⁡ ( β ) − sin ⁡ ( β ) sin ⁡ ( β ) cos ⁡ ( β ) ] [ x y ] = [ x cos ⁡ ( β ) − y sin ⁡ ( β ) x sin ⁡ ( β ) + y cos ⁡ ( β ) ] \mathbf{P'} = \begin{bmatrix} \cos(\beta) & -\sin(\beta) \\ \sin(\beta) & \cos(\beta) \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} x \cos(\beta) - y \sin(\beta) \\ x \sin(\beta) + y \cos(\beta) \end{bmatrix} P=[cos(β)sin(β)sin(β)cos(β)][xy]=[xcos(β)ysin(β)xsin(β)+ycos(β)]

这就是旋转后的坐标 P ′ P' P,其中:

  • 第一行给出了新的 x 坐标 x ′ = x cos ⁡ ( β ) − y sin ⁡ ( β ) x' = x \cos(\beta) - y \sin(\beta) x=xcos(β)ysin(β)
  • 第二行给出了新的 y 坐标 y ′ = x sin ⁡ ( β ) + y cos ⁡ ( β ) y' = x \sin(\beta) + y \cos(\beta) y=xsin(β)+ycos(β)

所以其实旋转矩阵就是从方程组的矩阵表示里得来的

非常的有品

以上

这篇关于二维空间中的点绕原点的旋转矩阵是怎么来的?(内含视频讲解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038677

相关文章

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序