第4章 二维图形变换
- 格式:ppt
- 大小:522.50 KB
- 文档页数:50
二维图形变换是平面几何中不可避免的一个环节。
它是指将一个平面上的图形,按照一定的规则进行平移、旋转、翻转等操作,从而新生成一个以原图形为基础的图形,这一系列操作就叫做二维图形变换。
在图形学、计算机视觉、计算机图形学、技术、动画等领域都有广泛的应用。
本文将介绍视觉图形的平移、旋转、翻转等变换方式及其位置作用。
一、平移变换平移变换是指将图形沿着某个方向移动一定的距离。
在平移变换中,原始图形的形状和大小保持不变,只是位置发生变化。
[pic1.png]上图中的矩形为原始图形,向右移动5个单位长度后得到的新图形为平移后的图形。
可以看出,平移后的图形与原始图形形状相同,只是位置发生了变化。
二、旋转变换旋转变换是指将图形绕着某个点旋转一定的角度。
在旋转变换中,原始图形的大小和形状保持不变,只是位置和方向发生了变化。
[pic2.png]上图中的矩形为原始图形,绕点A逆时针旋转45°后得到的新图形为旋转后的图形。
可以看出,旋转后的图形与原始图形大小和形状相同,只是方向偏转了45°。
三、翻转变换翻转变换是指将图形绕着某个轴对称翻转。
在翻转变换中,原始图形的大小和形状保持不变,只是位置和方向发生了变化。
[pic3.png]上图中的矩形为原始图形,绕着红色虚线所示的轴对称翻转后得到的新图形为翻转后的图形。
可以看出,翻转后的图形与原始图形大小和形状相同,只是方向发生了变化。
四、位置作用在二维图形变换中,原始图形和变换后的图形在位置上是有一定关系的。
例如,在平移变换中,原始图形向右平移5个单位长度,所得到的新图形的位置就比原始图形向右偏移了5个单位长度。
但是,若考虑到坐标系的影响,则需对图形的顶点进行坐标变换。
以平移变换为例,设原图形的四个点坐标为(x1, y1)、(x2, y2)、(x3, y3)、(x4, y4),平移距离为(dx, dy),则其变换后的新点坐标为(x1+dx, y1+dy)、(x2+dx, y2+dy)、(x3+dx, y3+dy)、(x4+dx, y4+dy)。
二维图形的几何变换正如我们在附录中提到的那样,用齐次坐标表示点的变换将非常方便,因此在本节中所有的几何变换都将采用齐次坐标进行运算。
二维齐次坐标变换的矩阵的形式是:这个矩阵每一个元素都是有特殊含义的。
形进行平移变换;[g h]是对图形作投影变换;[i]则是对图形整体进行缩放变换。
1)平移变换2)缩放变换3)旋转变换4)对称变换对称变换其实只是a、b、d、e取0、1等特殊值产生的一些特殊效果。
例如:当b=d=0,a=-1,e=1时有x´=-x,y´=y,产生与y轴对称的图形。
当b=d=0,a=-1,e=-1时有x´=x,y´=-y,产生与x轴对称的图形。
当b=d=0,a=e=-1时有x´=-x,y´=-y,产生与原点对称的图形。
当b=d=1,a=e=0时有x´=y,y´=x,产生与直线y=x对称的图形。
当b=d=-1,a=e=0时有x´=-y,y´=-x,产生与直线y=-x对称的图形。
5)错切变换当d=0时,x´=x+by,y´=y,此时,图形的y坐标不变,x坐标随初值(x,y)及变换系数b作线性变化。
当b=0时,x´=x,y´=dx+y,此时,图形的x坐标不变,y坐标随初值(x,y)及变换系数d作线性变化。
6)复合变换如果图形要做一次以上的几何变换,那么可以将各个变换矩阵综合起来进行一步到位的变换。
复合变换有如下的性质:复合平移对同一图形做两次平移相当于将两次的平移两加起来:复合缩放两次连续的缩放相当于将缩放操作相乘:复合旋转两次连续的旋转相当于将两次的旋转角度相加:缩放、旋转变换都与参考点有关,上面进行的各种变换都是以原点为参考点的。
如果相对某个一般的参考点(xf,yf)作缩放、旋转变换,相当于将该点移到坐标原点处,然后进行缩放、旋转变换,最后将(xf,yf)点移回原来的位置。
二维图形的几何变换1、基本几何变换及变换矩阵基本几何变换都是相对于坐标原点和坐标轴进行的几何变换,有平移、比例、旋转、反射和错切等。
1.1 平移变换是指将p点沿直线路径从一个坐标位置移到另一个坐标位置的重定位过程。
他是一种不产生变形而移动物体的刚体变换(rigid-body transformation),如下图所示。
图1-1 平移变换推导:求得平移变换矩阵如下:其中Tx,Ty称为平移矢量。
1.2 缩放变换缩放变换是指对p点相对于坐标原点沿x方向放缩Sx倍,沿y方向放缩Sy倍。
其中Sx和Sy称为缩放系数。
图1-2缩放变换(Sx=2,Sy=3)推导:矩阵:缩放变换可改变物体的大小,如下图所示。
当Sx=Sy >1时,图形沿两个坐标轴方向等比例放大;当Sx=Sy<1,图形沿两个坐标轴方向等比例缩小;当Sx≠Sy,图形沿两个坐标轴方向作非均匀的比例变换。
图1-3比例变换(a)Sx与Sy相等 (b)Sx与Sy 不相等1.3 旋转变换二维旋转是指将p点绕坐标原点转动某个角度(逆时针为正,顺时针为负)得到新的点p’的重定位过程。
图1-4旋转变换推导:利用极坐标方程逆时针旋转θ角的矩阵如下:1.4 对称变换对称变换后的图形是原图形关于某一轴线或原点的镜像。
图1-5对称变换(1)关于x轴对称图1-6关于x轴对称(2)关于y轴对称图1-7关于y轴对称(3)关于原点对称图1-8关于原点对称(4)关于y=x轴对称图1-9关于y=x轴对称(5)关于y=-x轴对称图1-10关于y=-x轴对称1.5 错切变换错切变换也称为剪切、错位变换,用于产生弹性物体的变形处理。
图1-11错切变换错切变换的变换矩阵为:(1)沿x方向错切:b=0(2)沿y方向错切:c=0(3)两个方向错切:b和c都不等于0。
2、复合变换如果图形要做一次以上的几何变换,那么可以将各个变换矩阵综合起来进行一步到位的变换。
复合变换有如下的性质:1)复合平移对同一图形做两次平移相当于将两次的平移两加起来:2)复合缩放两次连续的缩放相当于将缩放操作相乘:3)复合旋转两次连续的旋转相当于将两次的旋转角度相加:缩放、旋转变换都与参考点有关,上面进行的各种变换都是以原点为参考点的。
二位图形的几何变换算法分析:基本几何变换都是相对于坐标原点和坐标轴进行的几何变换,有平移、比例、旋转、反射和错切等。
1.平移:是指将某点沿直线路径从一个坐标位置移到另一个坐标位置的重定位过程。
他是一种不产生变形而移动物体变换。
可以根据矩阵获得点坐标,求得平移变换矩阵以后,得出点坐标。
(此实验以三维矩阵为例)2.缩放变换:缩放变换是指对p点相对于坐标原点沿x方向放缩Sx倍,沿y方向放缩Sy倍。
其中Sx和Sy称为缩放系数。
缩放变换可改变物体的大小,如下图所示。
当Sx=Sy >1时,图形沿两个坐标轴方向等比例放大;当Sx=Sy<1,图形沿两个坐标轴方向等比例缩小;当Sx≠Sy,图形沿两个坐标轴方向作非均匀的比例变换。
3 旋转变换二维旋转是指将p点绕坐标原点转动某个角度(逆时针为正,顺时针为负)得到新的点p’的重定位过程。
4 对称变换对称变换后的图形是原图形关于某一轴线或原点的镜像。
5 错切变换错切变换也称为剪切、错位变换,用于产生弹性物体的变形处理。
核心代码:int move(int dx, int dy) //将图形进行平面移动{int i;for(i = 0; i < 3; i++){line((array[i].x+dx),(array[i].y+dy),(array[(i+1)%3].x+dx), (array[(i+1)%3].y+dy));}getch();setcolor(0);for(i = 0; i < 3; i++){line((array[i].x+dx),(array[i].y+dy),(array[(i+1)%3].x+dx), (array[(i+1)%3].y+dy));}return 0;}int move_change(int sx,int sy) //平移并缩放{int arr_one[3];int arr_two[3];int i;for(i = 0; i < 3; i++){arr_one[i]=(array[i].x-array[0].x)*sx+array[0].x;arr_two[i]=(array[i].y-array[0].y)*sy+array[0].y;}for(i = 0; i < 3; i++){line(arr_one[i]+120,arr_two[i],arr_one[(i+1)%3]+120,arr_ two[(i+1)%3]);}getch();setcolor(0);for(i = 0; i < 3; i++){line(arr_one[i]+120,arr_two[i],arr_one[(i+1)%3]+120,arr_ two[(i+1)%3]);}return 0;}int turn_around(int x, int y, int a) //旋转图形{int i;int arr_one[3];int arr_two[3];for(i = 0; i < 3; i++){arr_one[i]=(array[i].x-x)*cos(a)-(array[i].y-y)*sin(a)+x;arr_two[i]=(array[i].x-x)*sin(a)+(array[i].y-y)*cos(a)+y;}for(i = 0; i < 3; i++){line(arr_one[i],arr_two[i],arr_one[(i+1)%3],arr_two[(i+1) %3]);}getch();setcolor(0);for(i = 0; i < 3; i++){line(arr_one[i],arr_two[i],arr_one[(i+1)%3],arr_two[(i+1) %3]);}return 0;}int move_turn(int a, int b, int d, int e) //平移并旋转{int i;int arr_one[3];int arr_two[3];for(i = 0; i < 3; i++){arr_one[i]=(a*array[i].x)+(b*array[i].y);arr_two[i]=(d*array[i].x)+(e*array[i].y);}for(i = 0; i < 3; i++){line(arr_one[i]+120+420,arr_two[i],arr_one[(i+1)%3]+12 0+420,arr_two[(i+1)%3]);}getch();setcolor(0);for(i = 0; i < 3; i++){line(arr_one[i]+120+420,arr_two[i],arr_one[(i+1)%3]+12 0+420,arr_two[(i+1)%3]);}return 0;}int move_turn_change(int b, int d) //平移,旋转并缩放{int i;int arr_one[3];int arr_two[3];for(i = 0; i < 3; i++){arr_one[i]=array[i].x+(b*array[i].y);arr_two[i]=(d*array[i].x)+array[i].y;}for(i = 0; i < 3; i++){line(arr_one[i],arr_two[i],arr_one[(i+1)%3],arr_two[(i+1) %3]);}getch();setcolor(0);for(i = 0; i < 3; i++){line(arr_one[i],arr_two[i],arr_one[(i+1)%3],arr_two[(i+1) %3]);}return 0;}实验截图:原图:。