二维旋转公式

2024-09-08 09:32
文章标签 公式 旋转 二维

本文主要是介绍二维旋转公式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二维旋转公式

ros的tf工具包可以很方便的实现任意坐标系之间的坐标转换。但是,如果只是想简单的测试想法,而又不想编写过于庞杂的代码,考虑自己写二维旋转的函数。而与二维旋转问题对偶的另一个问题便是二维坐标系旋转变换。这两个问题的形式基本一样,只是旋转的角度相差一个负号。就是这个容易搞混,所以做个笔记,以备查用。

1. 二维旋转公式(算法)

而(此文只针对二维)旋转则是表示某一坐标点 ( x 1 , y 1 ) (x_1, y_1) (x1,y1)某一坐标系下绕原点逆时针(正向)旋转角度 θ \theta θ后得到新的坐标点 ( x 2 , y 2 ) (x_2, y_2) (x2,y2)
在这里插入图片描述

推导:
假定 v = ( x , y ) v=(x, y) v=(x,y), v ′ = ( x ′ , y ′ ) v'=(x',y') v=(x,y),如上图有 x = r c o s ( ϕ ) , y = r s i n ( ϕ ) , x ′ = r c o s ( ϕ + θ ) , y ′ = r s i n ( ϕ + θ ) x=rcos(\phi),y=rsin(\phi),x'=rcos(\phi+\theta),y'=rsin(\phi+\theta) x=rcos(ϕ),y=rsin(ϕ),x=rcos(ϕ+θ),y=rsin(ϕ+θ)(注意,上图有几处错误,坐标轴边上的 c o s / s i n ( θ ) cos/sin(\theta) cos/sin(θ)应改为 c o s / s i n ( ϕ + θ cos/sin(\phi+\theta cos/sin(ϕ+θ)。展开 x ′ , y ′ x',y' x,y可得:
x ′ = r c o s ( ϕ ) c o s ( θ ) − r s i n ( ϕ ) s i n ( θ ) = x c o s ( θ ) − y s i n ( θ ) x'=rcos(\phi)cos(\theta)-rsin(\phi)sin(\theta)=xcos(\theta)-ysin(\theta) x=rcos(ϕ)cos(θ)rsin(ϕ)sin(θ)=xcos(θ)ysin(θ)
y ′ = r s i n ( ϕ ) c o s ( θ ) + r c o s ( ϕ ) s i n ( θ ) = x s i n ( θ ) + y c o s ( θ ) y'=rsin(\phi)cos(\theta)+rcos(\phi)sin(\theta)=xsin(\theta)+ycos(\theta) y=rsin(ϕ)cos(θ)+rcos(ϕ)sin(θ)=xsin(θ)+ycos(θ)

矩阵形式为: [ x ′ y ′ ] = [ c o s ( θ ) − s i n ( θ ) s i n ( θ ) c o s ( θ ) ] [ x y ] \left[\begin{matrix}x' \\ y'\end{matrix}\right]=\left[\begin{matrix} cos(\theta) & -sin(\theta) \\ sin(\theta) & cos(\theta)\end{matrix}\right]\left[\begin{matrix}x \\ y\end{matrix}\right] [xy]=[cos(θ)sin(θ)sin(θ)cos(θ)][xy]

则二维旋转矩阵为: A = [ c o s ( θ ) − s i n ( θ ) s i n ( θ ) c o s ( θ ) ] (1) A=\left[\begin{matrix} cos(\theta) & -sin(\theta) \\ sin(\theta) & cos(\theta)\end{matrix}\right] \tag{1} A=[cos(θ)sin(θ)sin(θ)cos(θ)](1)

void Rotate2(double x1, double y1, double alpha, double& x2, double& y2)
{x2 = x1 * cos(alpha) - y1 * sin(alpha);y2 = x1 * sin(alpha) + y1 * cos(alpha);
}

2. 二维坐标系旋转变换

假设有一坐标系 X O Y XOY XOY,经过逆时针(正向)旋转角度 θ \theta θ后,得到新的坐标系 X ′ O ‘ Y ′ X'O‘Y' XOY。得到原来坐标系中的坐标 ( x , y ) (x,y) (x,y)在新坐标系下的坐标值被称为坐标系转换。
在这里插入图片描述

x ′ = x c o s ( θ ) + y s i n ( θ ) = x c o s ( − θ ) − y s i n ( − θ ) x'=xcos(\theta)+ysin(\theta)=xcos(-\theta)-ysin(-\theta) x=xcos(θ)+ysin(θ)=xcos(θ)ysin(θ)
y ′ = − x s i n ( θ ) + y c o s ( θ ) = x s i n ( − θ ) + y c o s ( − θ ) y'=-xsin(\theta)+ycos(\theta)=xsin(-\theta)+ycos(-\theta) y=xsin(θ)+ycos(θ)=xsin(θ)+ycos(θ)

所以二维坐标旋转变换矩阵为: B = [ c o s ( θ ) s i n ( θ ) − s i n ( θ ) c o s ( θ ) ] = [ c o s ( − θ ) − s i n ( − θ ) s i n ( − θ ) c o s ( − θ ) ] (2) B=\left[\begin{matrix} cos(\theta) & sin(\theta) \\ -sin(\theta) & cos(\theta)\end{matrix}\right]=\left[\begin{matrix} cos(-\theta) & -sin(-\theta) \\ sin(-\theta) & cos(-\theta)\end{matrix}\right] \tag{2} B=[cos(θ)sin(θ)sin(θ)cos(θ)]=[cos(θ)sin(θ)sin(θ)cos(θ)](2)

结论

对比公式(1)与(2),可发现,二维旋转与二维坐标旋转形式一致,只是当旋转都为正向(逆时针)时,角度相差一个负号。也即,在同一坐标轴下将某一点 ( x , y ) (x,y) (x,y)沿原点正向(逆时针)旋转角度 θ \theta θ后得到的新坐标点 ( x ′ , y ′ ) (x',y') (x,y),等价于将点 ( x , y ) (x,y) (x,y)所在的坐标系 X O Y XOY XOY逆向(顺时针)旋转角度 θ \theta θ后,在新的坐标系 X ′ O ′ Y ′ X'O'Y' XOY下, ( x , y ) (x,y) (x,y)对应的新坐标点 ( x ′ , y ′ ) (x',y') (x,y)。拿起纸笔,多摆弄上面两张解释图,就清楚了。

这篇关于二维旋转公式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

poj 2187 凸包or旋转qia壳法

题意: 给n(50000)个点,求这些点与点之间距离最大的距离。 解析: 先求凸包然后暴力。 或者旋转卡壳大法。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <s

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决 问题描述 最近在投一篇期刊论文,直接提交word文档,当时没有查看提交预览,一审审稿意见全是:公式乱码、公式乱码、乱码啊!!!是我大意了,第二次提交,我就决定将word文档转成PDF后再提交,避免再次出现公式乱码的问题。接着问题又来了,我利用‘文件/导出’或‘文件/另存为’的方式将word转成PDF后,发现公式

C语言批量数据到动态二维数组

上一篇文章将文件读取放到静态创建的二维数组中,但是结合网络上感觉到今天的DT时代,这样批量大量读取一个上百行的数据,分配的内存是否可能因为大量的数据而产生溢出呢,最近一直研究里malloc函数,通过它来动态建立所需的二维数组,因此,通过文件操作和动态创建二维数组结合起来,将大量的数据动态的放入矩阵中,不知道这样的思想是否正确,下午把程序运行出来了,将程序贴上来,欢迎大家一起探讨:对于有规律的大数据

算法复杂度 —— 数据结构前言、算法效率、时间复杂度、空间复杂度、常见复杂度对比、复杂度算法题(旋转数组)

目录 一、数据结构前言 1、数据结构 2、算法 3、学习方法 二、 算法效率 引入概念:算法复杂度  三、时间复杂度 1、大O的渐进表示法 2、时间复杂度计算示例  四、空间复杂度 计算示例:空间复杂度 五、常见复杂度对比 六、复杂度算法题(旋转数组) 1、思路1 2、思路2 3、思路3 一、数据结构前言 1、数据结构         数据结构(D

不同饭局,如何说开场白才能打开氛围?教你一个万能公式

在人情社会中,饭局不仅是吃饱饭的场合,更是人际交往、情感交流的重要平台。无论是家庭聚会、商务宴请、朋友相聚还是同事联谊,一个恰当的开场白都能迅速打破沉默,营造温馨和谐的氛围。 针对现实生活中最常见的四种饭局,酱酒亮哥教你一个万能开场白公式,这个公式分为四步,当然,不是一步不落的照搬,需要灵活应用,挑其中的两步、三步就行了,只要打开氛围,我们的目的也就达到了。接下来我们一起学习一下,希望你在不同的