【图形学】二维几何变换的一些理论

2024-01-21 00:20

本文主要是介绍【图形学】二维几何变换的一些理论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一些概念

齐次坐标是用n+1维向量表示n维向量,例如点 P ( x , y ) 的齐次化坐标为 ( w x , w y , w ) , w 为任意不为 0 的数 P(x,y)的齐次化坐标为(wx,wy,w),w为任意不为0的数 P(x,y)的齐次化坐标为(wx,wy,w),w为任意不为0的数如果w取值为1,则称为规范化的齐次坐标。
二维几何变换矩阵
由于二维点的齐次坐标是一个包含三个元素的列向量,那么二维几何变换矩阵就应该是一个3*3的方阵。
T = [ a b e c d f p q s ] T=\begin{bmatrix} a&b&e\\ c&d&f\\ p&q&s \end{bmatrix} T= acpbdqefs
从功能上可以把二维变换矩阵分成四个子矩阵
T 0 = [ a b c d ] T 1 = [ e f ] T 2 = [ p q ] T 3 = [ s ] T 0 对图形进行比例,旋转,反射和错切变换 , T 1 进行平移变化, T 2 进行投影变换 , T 3 进行整体比例变换 T_0=\begin{bmatrix} a&b\\ c&d \end{bmatrix} T_1=\begin{bmatrix} e\\f\end{bmatrix} T_2=\begin{bmatrix} p&q\end{bmatrix} T_3=\begin{bmatrix} s\end{bmatrix}\\ T_0对图形进行比例,旋转,反射和错切变换,T_1进行平移变化,T_2进行投影变换,T_3进行整体比例变换 T0=[acbd]T1=[ef]T2=[pq]T3=[s]T0对图形进行比例,旋转,反射和错切变换,T1进行平移变化,T2进行投影变换,T3进行整体比例变换

二维图形基本几何变换矩阵

平移变换

平移变换是图形上每一个点移动相同的坐标,假设有一点 P ( x , y ) 移动到点 P ′ ( x ′ , y ′ ) P(x,y)移动到点P^{\prime}(x^{\prime},y^{\prime}) P(x,y)移动到点P(x,y)
{ x ′ = x + T x y ′ = y + T y ( T x , T y 是平移系数 ) \begin{cases} x^{\prime}=x+T_x\\ y^{\prime}=y+T_y \end{cases}(T_x,T_y是平移系数) {x=x+Txy=y+Ty(Tx,Ty是平移系数)
设二维平移变换矩阵为T
[ x ′ y ′ 1 ] = [ x + T x y + T y 1 ] = T [ x y 1 ] 得到 T = [ 1 0 T x 0 1 T y 0 0 1 ] \begin{bmatrix} x^{\prime}\\y^{\prime}\\1 \end{bmatrix}=\begin{bmatrix}x+T_x\\y+T_y\\1\end{bmatrix}=T\begin{bmatrix}x\\y\\1\end{bmatrix}得到T=\begin{bmatrix}1&0&T_x\\0&1&T_y\\0&0&1\end{bmatrix} xy1 = x+Txy+Ty1 =T xy1 得到T= 100010TxTy1

比例变换

P ( x , y ) 相对于原点,沿 x 轴方向缩放 S x 倍,沿 Y 轴方向缩放 S y 倍到点 P ′ ( x ′ , y ′ ) P(x,y)相对于原点,沿x轴方向缩放S_x倍,沿Y轴方向缩放S_y倍到点P_{\prime}(x^{\prime},y^{\prime}) P(x,y)相对于原点,沿x轴方向缩放Sx倍,沿Y轴方向缩放Sy倍到点P(x,y)
设二维变换矩阵为T
[ x ′ y ′ 1 ] = [ x T x y T y 1 ] = T [ x y 1 ] 得到 T = [ T x 0 0 0 T y 0 0 0 1 ] \begin{bmatrix} x^{\prime}\\y^{\prime}\\1 \end{bmatrix}=\begin{bmatrix}xT_x\\yT_y\\1\end{bmatrix}=T\begin{bmatrix}x\\y\\1\end{bmatrix}得到T=\begin{bmatrix}T_x&0&0\\0&T_y&0\\0&0&1\end{bmatrix} xy1 = xTxyTy1 =T xy1 得到T= Tx000Ty0001

更一般的情况, P 相对于点 ( p x , p y ) 进行比例变换到 P ′ P相对于点(p_x,p_y)进行比例变换到P^{\prime} P相对于点(px,py)进行比例变换到P。有 { x ′ = S x ( x − p x ) + p x y ′ = S y ( y − p y ) + p y \begin{cases} x^{\prime}=S_x(x-p_x)+p_x\\ y^{\prime}=S_y(y-p_y)+p_y \end{cases} {x=Sx(xpx)+pxy=Sy(ypy)+py
此时的二维变换矩阵T为 T = [ S x 0 p x ( 1 − S x ) 0 S y p y ( 1 − S y ) 0 0 1 ] \\T=\begin{bmatrix} S_x&0&p_x(1-S_x)\\ 0&S_y&p_y(1-S_y)\\ 0&0&1 \end{bmatrix} T= Sx000Sy0px(1Sx)py(1Sy)1

旋转变换

点P相对于坐标原点旋转一个角度 β \beta β得到点 P ′ P^{\prime} P
对点P,用极坐标可以表示成 { x = r cos ⁡ α y = r sin ⁡ α \begin{cases} x=r \cos\alpha\\y=r \sin\alpha \end{cases} {x=rcosαy=rsinα
旋转后点 P ′ P^{\prime} P,用极坐标表示为 { x ′ = r cos ⁡ ( α + β ) = r cos ⁡ α cos ⁡ β − r sin ⁡ α sin ⁡ β = x cos ⁡ β − y sin ⁡ β y ′ = r sin ⁡ ( α + β ) = r sin ⁡ α cos ⁡ β + r cos ⁡ α sin ⁡ β = y cos ⁡ β + x sin ⁡ β \begin{cases} x^{\prime}=r\cos(\alpha+\beta)=r\cos\alpha\cos\beta-r\sin\alpha\sin\beta=x\cos\beta-y\sin\beta \\y^{\prime}=r\sin(\alpha+\beta)=r\sin\alpha\cos\beta+r\cos\alpha\sin\beta=y\cos\beta+x\sin\beta \end{cases} {x=rcos(α+β)=rcosαcosβrsinαsinβ=xcosβysinβy=rsin(α+β)=rsinαcosβ+rcosαsinβ=ycosβ+xsinβ
由此可以得到二维变换矩阵T
T = [ cos ⁡ β − sin ⁡ β 0 sin ⁡ β cos ⁡ β 0 0 0 1 ] T=\begin{bmatrix} \cos\beta&-\sin\beta&0\\ \sin\beta&\cos\beta&0\\ 0&0&1 \end{bmatrix} T= cosβsinβ0sinβcosβ0001

更一般的情况,点P绕点 ( p x , p y ) (p_x,p_y) (px,py)旋转角度 β \beta β
{ x ′ = ( x − p x ) cos ⁡ β − ( y − p y ) sin ⁡ β + p x y ′ = ( x − p x ) sin ⁡ β + ( y − p y ) cos ⁡ β + p y \begin{cases} x^{\prime}=(x-p_x)\cos\beta-(y-p_y)\sin\beta+p_x\\ y^{\prime}=(x-p_x)\sin\beta+(y-p_y)\cos\beta+p_y \end{cases} {x=(xpx)cosβ(ypy)sinβ+pxy=(xpx)sinβ+(ypy)cosβ+py
此时的二维变换矩阵T为
T = [ cos ⁡ β − sin ⁡ β p x ( 1 − cos ⁡ β ) + p y sin ⁡ β sin ⁡ β cos ⁡ β p y ( 1 − cos ⁡ β ) − p x sin ⁡ β 0 0 1 ] T=\begin{bmatrix} \cos\beta&-\sin\beta&p_x(1-\cos\beta)+p_y\sin\beta\\ \sin\beta&\cos\beta&p_y(1-\cos\beta)-p_x\sin\beta\\ 0&0&1 \end{bmatrix} T= cosβsinβ0sinβcosβ0px(1cosβ)+pysinβpy(1cosβ)pxsinβ1

对称变换

关于原点对称,二维变换矩阵T
T = [ − 1 0 0 0 − 1 0 0 0 1 ] T=\begin{bmatrix} -1&0&0\\ 0&-1&0\\ 0&0&1 \end{bmatrix} T= 100010001
关于x轴对称,二维变换矩阵T
T = [ 1 0 0 0 − 1 0 0 0 1 ] T=\begin{bmatrix} 1&0&0\\ 0&-1&0\\ 0&0&1 \end{bmatrix} T= 100010001
关于轴对称,二维变换矩阵T
T = [ − 1 0 0 0 1 0 0 0 1 ] T=\begin{bmatrix} -1&0&0\\ 0&1&0\\ 0&0&1 \end{bmatrix} T= 100010001
关于点 ( p x , p y ) (p_x,p_y) (px,py)对称的二维变换矩阵T
T = [ − 1 0 2 p x 0 − 1 2 p y 0 0 1 ] T=\begin{bmatrix} -1&0&2p_x\\ 0&-1&2p_y\\ 0&0&1 \end{bmatrix} T= 1000102px2py1

错切变换

错切是点P相对于x,y轴进行不等量变化的过程。
相对于原点进行错切变换
{ x ′ = x + λ x y y ′ = λ y x + y \begin{cases} x^{\prime}=x+\lambda _x y\\y^{\prime}=\lambda _yx+y \end{cases} {x=x+λxyy=λyx+y
二维变换矩阵T为 T = [ 1 λ x 0 λ y 1 0 0 0 1 ] T=\begin{bmatrix} 1&\lambda _x&0\\ \lambda _y&1&0\\ 0&0&1 \end{bmatrix} T= 1λy0λx10001
相对于点 ( p x , p y ) (p_x,p_y) (px,py)进行错切变换
{ x ′ = x + λ x ( y − p x ) y ′ = λ y ( x − p y ) + y \begin{cases} x^{\prime}=x+\lambda _x (y-p_x)\\y^{\prime}=\lambda _y(x-p_y)+y \end{cases} {x=x+λx(ypx)y=λy(xpy)+y
二维变换矩阵T为 T = [ 1 λ x − λ x p x λ y 1 − λ y p y 0 0 1 ] T=\begin{bmatrix} 1&\lambda _x&-\lambda _xp_x\\ \lambda _y&1&-\lambda _yp_y\\ 0&0&1 \end{bmatrix} T= 1λy0λx10λxpxλypy1

这篇关于【图形学】二维几何变换的一些理论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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<

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

HDU 2159 二维完全背包

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

二维旋转公式

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

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

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

HLJUOJ1118(二维树状数组)

1118: Matrix Time Limit: 4 Sec   Memory Limit: 128 MB Submit: 77   Solved: 12 [ Submit][ Status][ Web Board] Description 给定一个1000*1000的二维矩阵,初始矩阵中每个数都为1,然后为矩阵有4种操作. S x1 y1 x2 y2:计算(x1,y1)、(x2

hdu1892(二维树状数组)

See you~ Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 3726    Accepted Submission(s): 1168 题目链接: http://acm.hdu.edu.cn/showproblem.php

系统架构师考试学习笔记第三篇——架构设计高级知识(19)嵌入式系统架构设计理论与实践

本章考点:         第19课时主要学习嵌入式系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分)。在历年考试中,案例题对该部分内容都有固定考查,综合知识选择题目中有固定分值的考查。本课时内容侧重于对知识点的记忆、理解和应用,按照以往的出题规律,嵌入式系统架构设计基础知识点基本来源于教材内。本课时知识架构如图19.1所示。 一、嵌入式系统发展历程