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

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

相关文章

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处