Presentation is loading. Please wait.

Presentation is loading. Please wait.

二维变换 计算机科学与技术系.

Similar presentations


Presentation on theme: "二维变换 计算机科学与技术系."— Presentation transcript:

1 二维变换 计算机科学与技术系

2 概述 图形变换是计算机图形学基础内容之一 常见变换:几何变换,投影变换,视口变换 几何变换:平移、旋转和缩放等
模型视图变换:世界->观察 投影变换: 3D->2D 视窗变换: 窗口->视口 应用层 几何层 光栅化 3D 2D Pixels 几何变换 模视变换 投影变换 视口变换

3 几何变换 几何变换是应用图形编程中最常用的变换 几何变换目的 图形的几何信息经过几何变换后产生新的图形

4 几何变换 特点 属性不变,拓扑关系不变 变换的两种形式: 图形不变,坐标系改变 图形改变,坐标系不变 点线关系

5 几何变换 作用 可用于图形复制 减少用户的数据输入 把用户坐标系与设备坐标系联系起来 可由简单图形生成复杂图形 可用二维图形表示三维形体
动态显示 几何变换的基础是点变换

6 图形的几何变换基础-标量、点和向量 在CG中,主要是处理点和线段这样的几何元素 向量是有向的线段和用表示它们的n元数组
三个常用的实体-抽象数据类型 点:在3D中点是一个位置,数学上的点没有大小,也没有形状 标量:对于几何对象,还需要实数来确定数量 向量:表示既有大小还有方向的量

7 图形的几何变换基础-空间 向量空间(线性空间) 仿射空间 Euclid空间 对象:向量、标量 运算:标量--向量乘法、向量--向量加法
向量空间的扩展 对象:向量、标量、点(增加位置信息) 运算:点--点减法、向量--点加法 Euclid空间 增加了距离 对象:严格来讲,只包含两个对象,向量、标量 运算:点积(内积)

8 图形的几何变换数学基础 向量运算:和、点积、长度、叉积 矩阵运算:和、数乘、乘法、零矩阵、单位矩阵、逆矩阵、转置矩阵 齐次坐标

9 这种用3个代数分量表示2D几何概念的方式是一种齐次坐标表示。
图形的几何变换基础-齐次坐标 “齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR 对于一个向量v以及基oab,可以找到一组坐标(v1,v2),使得v = v1 a + v2 b            而对于一个点p,则可以找到一组坐标(p1,p2),使得  p – o = p1 a + p2 b     p = p1 a + p2 b + o 这种用3个代数分量表示2D几何概念的方式是一种齐次坐标表示。

10 图形的几何变换基础-齐次坐标 齐次坐标:以 n+1 维向量表示一个 n 维向量问题
在 n 维空间中,点的位置用非齐次坐标表示时,具有 n 个坐标分量(p1, p2, … …, pn),且是唯一的。若用齐次坐标表示则为(hp1, hp2, … …, hpn, h), 且不唯一,其中h≠0。

11 图形的几何变换基础-齐次坐标 若二维点(x, y)的齐次坐标表示为(hx, hy, h),则(h1x, h1y, h1),也是同一点的齐次坐标。 三维点的齐次坐标可表示为(hx, hy, hz, h) 例如: 点P(2, 3)的齐次坐标: (1, 1.5, 0.5)、(4, 6, 2)、(6, 9, 3) -〉(2*h,3*h,h) 普通坐标转换成齐次坐标,给x,y乘上同一个非零数h,然后增加第3个分量h; 齐次坐标转换成普通坐标,把前两个坐标同时除以第3个坐标,然后去掉第3个分量。

12 二维点(x, y)的齐次坐标 h可以取不同的值,所以同一点的齐次坐标不是唯一的。
如普通坐标系下的点(2,3)变换为齐次坐标可以是(1,1.5,0.5)、(4,6,2)、(6,9,3)等等。 (x,y)点对应的齐次坐标为 (x,y)点对应的齐次坐标可理解为三维空间的一条直线

13 图形的几何变换基础-齐次坐标 普通坐标与齐次坐标的关系为“一对多” 由普通坐标h→齐次坐标 由齐次坐标÷h→普通坐标
为前n个坐标就是普通坐标系下的n维坐标。 在二维几何变换中,取 h = 1。即: (x y) 的齐次坐标是 (x y 1)

14 二维基本几何变换 二维基本几何变换是相对于原点或坐标轴进行的 平移变换 x’ = x + Tx y’ = y + Ty 旋转变换
x’ = x cosθ- y sinθ y’ = x sinθ+ y cosθ 比例变换 x’ = Sxx y’ = Syy (x,y) (x’,y’)

15 二维基本几何变换 分以y 轴对称、以x 轴对称、以原点轴对称、直线y = x 对称、以直线y = -x 对称五种情况 反射(对称、镜像)变换
例如, sx = -1 sy = 1 原始图 sx = -1 sy = -1 sx = 1 sy = -1

16 二维基本几何变换 错切变换 分沿x 轴方向错切、沿y 轴方向错切、沿xy 两个轴方向错切三种情况 例:沿x 轴方向错切:
x’ = x + by=x + y cot θ y’ = y 注:平移和旋转变换不改变形体的形状和大小,又称为刚体变换, 错切和缩放不是刚体变换

17 二维基本几何变换的矩阵形式 旋转变换可以表达为矩阵形式: 用矩阵表示变换,不仅书写简单,而且连续施加变换可以写成矩阵连乘的形式。
比例、反射、错切变换都能写成矩阵形式,只有平移变换不能。如何使平移变换也能写成矩阵形式呢? [x’ y’] = [x y] cosθ sinθ sinθ cosθ = [ x cosθ- y sinθ x sinθ+ y cosθ]

18 二维基本几何变换的矩阵形式 二维几何变换的基本方法
将变换矩阵作为一个算子,作用于变换前的图形顶点集合的规范化齐次坐标矩阵上,得到变换后的图形顶点集合的规范化齐次坐标矩阵。 设二维图形变换前坐标为(x,y,1),变换后为(x*,y*,1) 二维变换矩阵 注意:T2D可看作三个行向量 (x*, y*, 1) = (x, y, 1) T2D

19 基本几何变换的矩阵形式-平移变换 平移变换只改变图形的位置,不改变图形的大小和形状

20 基本几何变换的矩阵形式-比例变换 以坐标原点为放缩参照点 当Sx=Sy=1时:恒等比例变换
当Sx=Sy>1时:沿x, y方向等比例放大。 当Sx=Sy<1时:沿x, y方向等比例缩小 当SxSy时:沿x, y方向作非均匀的比例变换,图形变形。

21 基本几何变换的矩阵形式-反射变换 当Sx=-1, Sy=1时与y轴对称的反射变换 当Sx=1, Sy=-1时与x轴对称的反射变换
原始图 当Sx=1, Sy=-1时与x轴对称的反射变换 当Sx=-1, Sy=-1时与原点对称的反射变换

22 基本几何变换的矩阵形式-旋转变换 注意θ是逆时针旋转角度

23 (d)沿y正向错切 (e)沿y负向错切 (f)沿x和y正向错切
基本几何变换的矩阵形式-错切变换 (a)正方形 (b)沿x正向错切 (c)沿x负向错切 (d)沿y正向错切 (e)沿y负向错切 (f)沿x和y正向错切 错切变换

24 基本几何变换的矩阵形式-错切变换 当d=0时,(x* y* 1)=(x+by y 1),图形的y坐标不变;
当b>0,图形沿+x方向作错切位移。 当b<0,图形沿-x方向作错切位移。

25 基本几何变换的矩阵形式-错切变换 当b=0时, (x′y′1)=(x dx+y 1)图形的x坐标不变;
当d>0,图形沿+y方向作错切位移。 当d<0,图形沿-y方向作错切位移。

26 基本几何变换的矩阵形式-错切变换 当b0且d0时,(x′y′1)=(x+by dx+y 1) 图形沿x, y两个方向作错切位移。
错切变换引起图形角度关系的改变,甚至导致图 形发生变形。

27 二维基本几何变换的矩阵形式 从变换功能上可把T2D分为四个子矩阵 沈阳工业大学信息科学与工程学院 计算机图形学

28 二维复合变换 基本几何变换的基本二字的含义是指有一定限制的,不适用于所有的变换。 复合变换又称级联变换,指对图形做一次以上的几何变换。
注意:任何一个线性变换都可以分解为上述几类变换。 注意:

29 复合平移 求点P(x, y)经第一次平移变换(Tx1,Ty1),第二次平移变换(Tx2, Ty2)后的坐标P*(x*, y*)
设点P(x,y,1)经第一次平移变换后的坐标为P‘(x y 1),则 经第二次平移变换后的坐标为P*(x* y* 1) 则复合变换矩阵为Tt=Tt1•Tt2

30 多种复合组合 例:对一线段先放大2倍(即Sx=Sy=2),再平移Tx=10,Ty=0。
设点(x,y)为线段上的任意一点,点(x´,y´)为点(x,y)放大 后的坐标,点(x´´,y´´)为点(x´,y´)平移后的坐标,则: [x´, y´, 1]= [x, y, 1]*S2 [x´´, y´´, 1]= [x´, y´, 1]*T2 [x´´, y´´, 1]= [x, y, 1]*S2*T2 令:M=S2(2,2)*T2(10,0) ,则M即为复合变换

31 任意点的旋转变换 基本几何变换的旋转θ角是指 “绕原点旋转θ角” 对绕A点旋转θ角的情况要用到复合变换(基本几何变换的组合)。
利用复合变换调整参考点 几何变换不改变图形的连接关系和平行关系

32 任意点的旋转变换 例: 一个由顶点P1(10,10),P2(30,10)和P3(20,25)所定义的三角形,相对于点Q(10,25)逆时针旋转30°,求变换后的三角形顶点坐标。 Q P3 P2 P1 平移变换 P1 P2 P3 Q 原始图形

33 任意点的旋转变换 Q P3 P2 P1 Q P3 P2 P1

34 任意点的旋转变换 P1(17.5,12.01),P2(34.82,22.01)和P3(18.66,30)

35 任意方向的二维几何变换 例: 将三角形相对于轴线y=kx+b作反射变换,计算每一步的变换矩阵 y=kx+b (0,b) 原始图形 平移变换

36 任意方向的二维几何变换 旋转变换 反射变换

37 任意方向的二维几何变换 反旋转变换 反平移变换

38 几何变换程序实现 class CP2 { public: CP2(); class CTransform//二维几何变换
CP2(double,double); double x, y, w; }; class CTransform//二维几何变换 { public: CTransform(); virtual ~CTransform(); void SetMat(CP2 *,int); void Identity(); void Translate(double,double);//平移变换矩阵 void Scale(double,double);//比例变换矩阵 void Scale(double,double,CP2);//相对于任意点的比例变换矩阵 void Rotate(double);//旋转变换矩阵 void Rotate(double,CP2);//相对于任意点的旋转变换矩阵 void ReflectO();//原点反射变换矩阵 void ReflectX();//X轴反射变换矩阵 void ReflectY();//Y轴反射变换矩阵 void Shear(double,double);//错切变换矩阵 void MultiMatrix();//矩阵相乘 double T[3][3]; CP2 *POld; int num; };

39 void CTransform::Identity()//单位矩阵
{ T[0][0]=1.0;T[0][1]=0.0;T[0][2]=0.0; T[1][0]=0.0;T[1][1]=1.0;T[1][2]=0.0; T[2][0]=0.0;T[2][1]=0.0;T[2][2]=1.0; } void CTransform::Translate(double tx, double ty)//平移变换矩阵 Identity(); T[2][0]=tx; T[2][1]=ty; MultiMatrix(); void CTransform::Scale(double sx, double sy)//比例变换矩阵 T[0][0]=sx; T[1][1]=sy;

40 void CTransform::Rotate(double beta)//旋转变换矩阵
{ Identity(); double rad=beta*PI/180; T[0][0]=cos(rad); T[0][1]=sin(rad); T[1][0]=-sin(rad);T[1][1]=cos(rad); MultiMatrix(); } void CTransform::Rotate(double beta,CP2 p)//相对于任意点的旋转变换矩阵 Translate(-p.x,-p.y); Rotate(beta); Translate(p.x,p.y); void CTransform::ReflectO()//原点反射变换矩阵 T[0][0]=-1; T[1][1]=-1;

41 void CTransform::ReflectX()//X轴反射变换矩阵
{ Identity(); T[0][0]=1; T[1][1]=-1; MultiMatrix(); } void CTransform::ReflectY()//Y轴反射变换矩阵 T[0][0]=-1; T[1][1]=1; void CTransform::Shear(double b,double c)//错切变换矩阵 T[0][1]=b; T[1][0]=c;

42 void CTransform::MultiMatrix()//矩阵相乘
{ CP2 *PNew=new CP2[num]; for(int i=0;i<num;i++) PNew[i]=POld[i]; } for(int j=0;j<num;j++) POld[j].x=PNew[j].x*T[0][0]+PNew[j].y*T[1][0] +PNew[j].w*T[2][0]; POld[j].y=PNew[j].x*T[0][1]+PNew[j].y*T[1][1] +PNew[j].w*T[2][1]; POld[j].w=PNew[j].x*T[0][2]+PNew[j].y*T[1][2] +PNew[j].w*T[2][2]; delete []PNew;


Download ppt "二维变换 计算机科学与技术系."

Similar presentations


Ads by Google