二维图形旋转公式的推导(逆时针、顺时针)

2023-10-13 11:40

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

    关于二维图形旋转可能在很多计算机图形学相关的书籍上都会介绍,然而真正理解公式推导过程的却讲得不多。那么如何推导出二维图形绕某一点旋转的公式呢?我在这里就将其推导过程简要的说明一下。

其实推导过程比较简单,首先我们来看一幅图,看看如何推导出二维图形绕原点进行旋转的公式。

上图画的比较粗略,不过能说明问题就够了。假设旋转前的点位于P处,旋转之后的点位于P'处。如何求旋转之后的点P'坐标?

在图中,旋转之前P的方向角是a,旋转之后P'的方向角就变为a+b,这里b就是旋转的角度,所谓方向角是改点和原点连线与X轴正向的夹角。旋转的正方向是逆时针

在图中,从P'点向X轴引垂线,垂足为B点,根据三角形的基础知识,可以写出如下的等式。

公式1中的R就是点P以及P'到原点的距离

由公式1,根据高中三角函数的知识,即和差公式得到如下等式2

通过观察上式,Rcos(a)=x,Rsin(a)=y,所以上式进一步花间可以得到下面的等式。

这个公式就是我们经常看到的二维图形旋转的公式,这样绕原点的旋转公式推导出来了,那么嗨经常碰到的绕某一点旋转的,比如绕着矢量图形的中心旋转的。在这种情况下,首先需要平移,然后旋转,最后平移回去,具体过程如下。

由上图可知,(x0,y0)是旋转的顶点,那么先将图形平移到原点,然后绕着原点旋转b角度,最后平移到(x0,y0)上去。

那么很容易可知绕任意一点(x0,y0)旋转的公式为

 

 

是不是比较简单,我觉得还行。

 先介绍一个公式,即点(x,y)绕原点逆时针旋转α得到(x',y')的公式
x'=xcosα-ysinα
y'=xsinα+ycosα

现在顺时针旋转α,即逆时针旋转-α,用-α代替上面的α,并根据公式cos(-α)=cosα,sin(-α)=-sinα得
x'=xcosα+ysinα
y'=-xsinα+ycosα

最后如果旋转中心为(a,b),在利用上面的公式时,需要把(a,b)沿向量(-a,-b)移动到原点,此时(x,y)变成(x-a,y-b),(x',y')变成(x'-a,y'-b),整理得
x'=(x-a)cosα+(y-b)sinα+a
y'=-(x-a)sinα+(y-b)cosα+b

转载于:https://www.cnblogs.com/azbane/p/7306614.html

这篇关于二维图形旋转公式的推导(逆时针、顺时针)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

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<

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

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

第六章习题11.输出以下图形

🌏个人博客:尹蓝锐的博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~ 1、题目要求: 输出以下图形

二维旋转公式

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