第三章 图形变换
左手系 右手系
第一节 变换的数学基础 一、向量及向量运算 设有向量, 有关的向量运算有: 1) 向量的长度 2)两个向量的和差运算
3) 两个向量的点乘积 4) 两个向量的叉乘积
二、矩阵及矩阵运算 由 个 数排成的矩形表
有关的矩阵运算 1.数乘矩阵 2.矩阵的加法运算
3.矩阵的乘法运算 设有矩阵 、 ,则这两个矩阵的乘积矩阵 为:
矩阵运算具有如下基本性质: 数乘矩阵适合分配律和结合律,即:
矩阵的加法适合交换律和结合律, 其中 , , 为矩阵。 矩阵的乘法适合结合律,即: 矩阵的乘法对加法适合分配律,即: 矩阵的乘法不适合交换律
4.单位矩阵 5. 逆矩阵 对任意矩阵,如果存在 ,则称 为的逆矩阵。 6.转置矩阵 将矩阵 的行、列互换而得到的 阶矩阵称作的转置矩阵,记为 。
矩阵的转置具有如下几个基本性质: 三、齐次坐标 齐次坐标表示法就是用n+1维向量表示一个n维向量。
n维空间中的点的位置向量用非齐次坐标表示时, 具有n个坐标分量,并且是唯一的。如果用齐次坐标表示时,该向量有n+1个坐标分量, 并且是不唯一的。 如二维点 的齐次坐标表示为 ,则 , , …, 都是表示二维空间中的同一个点. 三维空间中的坐标点的齐次坐标可表示为 .
应用齐次坐标可以有效地用矩阵运算把二维、三维甚至更高维空间中点集从一个坐标系转换到另一个坐标系中。
第二节 二维图形变换 对一个图形作几何变换就是对该图形上的每一个点作相应的几何变换。 常见的基本二维图形几何变换有平移变换、比例变换和旋转变换。
平移变换
比例变换
旋转变换
齐次坐标系:用n+1维向量表示n维向量的方法 设有不全为0的三个数(x1,x2,x3)为齐次坐标
设平面上有齐次坐标为P=(x,y,1)的一点,分别经过平移、比例和旋转变换为齐次坐标为P’=(x’,y’,1)的一点,求变换矩阵 1.平移变换
2.比例变换
3.旋转变换
常见的变换 1.对称变换(反射、镜像变换)
2.错切变换(错移变换) (1)沿X轴方向关于Y的错切(Y不变)
(2)沿Y轴方向关于X的错切(X不变)
(3)沿X轴Y轴两个方向的错切
例一:求图形绕平面上任意一点(x0,y0)的旋转变换矩阵 ,设旋转角度为 (1)平移T(-x0,-y0),使旋转中心与原点重合 (2)绕原点逆时针旋转R( ) (3)平移T(x0,y0),使旋转中心移回原处
例二:相对于平面上任意一点 的比例变换 如下: (1)平移T(-x0,-y0),使比例中心与原点重合 (2)相对于原点的比例变换 例二:相对于平面上任意一点 的比例变换 如下: (1)平移T(-x0,-y0),使比例中心与原点重合 (2)相对于原点的比例变换 (3)平移T(x0,y0),比例中心移回原处
二维图形变换总结:
第三节 二维视见变换 窗口就是在用户坐标系中指出的那个要显示出来的区域,这一区域通常为矩形区域。 视见区是屏幕域中的一个子区域,通常为矩形区域,它最大与屏幕域等同。
窗口与视见区的差别: 窗口是在用户坐标系中确定的,它指出了要 显示的图形; 视见区在设备坐标系中确定,它指出了实际 显示的图形处于显示屏幕的哪一部分。 视见区用于显示窗口中的图形。
视见变换就是将用户坐标系窗口中指定 的图形转换至设备坐标系视区 中显示的过程。 视见变换的实现: 窗口:左下角点(wxl,wyl) 右上角点(wxh,wyh) 视区:左下角点(vxl,vyl) 右上角点(vxh,vyh) 1.
2.另一种处理方式,求一个变换矩阵
设窗口中图形上的某一点坐标为 ,该点显示在视见区中的坐标为 ,利用视见变换矩阵可得出以下计算公式:
第四节 三维图形变换 1.平移变换
2.比例变换
3.旋转变换
① 绕Z轴旋转
②绕X轴旋转
③绕Y轴旋转
4.对称变换 (1)相对于xy平面的对称变换,z=0平面 (2)相对于xz平面的对称变换,y=0平面
(4)相对于空间任一平面做对称变换 1)将此平面变换为与某一坐标面重合 2)做相对于该坐标面的对称变换 3)将平面反变换回原位置 5.错切变换
三维图形变换 旋转,比例,对称,错切变换 平移变换 投影变换 整体比例变换
例: 设三维空间中有一条任意直线,它 由直线上一点Q和沿直线方向的单位 方向向量n确定。 Q点坐标为 , 直线向量 求绕这条直线旋转 角的旋转变换矩阵。
(1)做绕X轴旋转 角的变换,使旋转轴落在Y=0上。 过坐标原点的任意直线为旋转轴的旋转变换可分为五步实现: (1)做绕X轴旋转 角的变换,使旋转轴落在Y=0上。 (2) 做绕Y轴旋转 角的变换,使旋转轴与Z轴重合。 (3) 做绕Z轴旋转 角的旋转变换。 (4) 做第2步的逆变换,即做绕Y轴- 旋转变换 (5) 做第1步的逆变换,即做绕X轴- 旋转变换
15. (1)绕x轴旋转到xz平面,然后绕y轴旋转到z轴
(2)绕y轴旋转到yz平面,然后绕x轴旋转到z轴
(3)绕z轴旋转到xz平面,然后绕y轴旋转到z轴
第五节 投影 三维观察过程: 世界坐标系→观察坐标系→观察表面 投影:把n维空间中的点投射到小于n维的空间中去 投影的形成:首先在三维空间中确定一个投影中心和一个投影平面,然后从投影中心引出一些投射直线,这些直线通过形体上的每一点,与投影平面相交,在投影平面上就形成了形体的投影。 投影中心与投影平面之间距离为d d无限 平行投影,投射线平行,立体感差,能保持比 例关系 d有限 透视投影,立体感强,更真实,但不能保持原 来的比例关系
一.平行投影 1.正交投影 投影方向与投影平面的法向相同 常见的正交投影是正视投影、顶视投影和侧视投影 1.正交投影 投影方向与投影平面的法向相同 常见的正交投影是正视投影、顶视投影和侧视投影 如果投影平面Z=0,投影方向是沿Z轴,设三维空间中有普通坐标为(x,y,z)的一点P,投影后,成为点P’,普通坐标为 (x’,y’,z’) 可知:
正投影:投影平面垂直于坐标轴的正交投影。 等轴投影:投影方向与三个坐标轴的夹角都相等。 这种投影能使在三个坐标轴方向上有相 等的透视缩短。
2.斜交投影 当平行投影中投影平面的法线方向与投影方向不同时就得到斜交投影。在斜交投影中,投影平面一般取坐标平面。
设三维空间中有普通坐标为的任意一点 ,经斜交投影后所得投影点普通坐标为 。显然 ,有:
斜二测投影:垂直于投影平面的线段长度缩短为原来的一半; 斜等轴投影:使垂直于投影平面的线段仍保持长度.
二.透视投影 性质: 任意一组平行直线,如果平行于投影平面,则经透视投影后所得到的直线或者重合,或者仍保持平行;如果不平行于投影平面,将不再保持平行,并且必会汇聚于同一点,这个点称为消失点,也称为灭点。 空间中可以取得任意多组不平行于投影平面的平行直线,所以消失点也可以取得任意多个。
主消失点:如果一组平行直线平行于三个坐标轴中的一个,那么对应的消失点将落在坐标轴上,这样的消失点称为主消失点。 因为只有三个坐标轴,所以最多只有三个主消失点。根据主消失点的数目,透视投影可以分为一点透视、二点透视、三点透视。 如果投影平面截Z轴并与它垂直,这时就只能在Z轴方向上有主消失点。
单消失点的透视投影计算 投影中心是坐标原点 投影平面垂直于Z轴 设投影平面位于处Z=d,可设d>0。这样投影平面是平面Z=d,对空间中任意一点P ,其普通坐标为(x,y,z),它在投影平面上的投影点P’ 的普通坐标为(x’,y’,z’)
使用齐次坐标可以得出:
对齐次坐标进行规范化后得: 透视投影变换矩阵为:
实用中常取为投影平面,这时投影中心可取空间中任意一点 , 如图3 实用中常取为投影平面,这时投影中心可取空间中任意一点 , 如图3.24所示,这里假定了 是一个负数,即 , 当然这个假定并不是必要的。用前面相同的方法,可以得出:
可以用齐次坐标验证,有: 将结果规范化后得到齐次坐标为:
例子:求世界坐标系到观察坐标系的变换矩阵 1)首先确定观察坐标系 观察位置定为观察坐标系的原点, 观察方向为zv轴的方向,指向世界坐标系的原点 假定xv轴平行于世界坐标系的z=0平面 这样观察坐标系唯一确定 2)世界坐标系的客体坐标变换到观察坐标系的坐标 3)在观察坐标系做投影变换,得到投影图
设物体上一点在世界坐标系中坐标为(xw,yw,zw,1),则在观察坐标系中(xv,yv,zv,1)= (xw,yw,zw,1)*V 1)将用户坐标系的原点平移到视点(设视点在用户坐标系下的坐标为(a,b,c),xv轴一定在z=c平面内)。形体上的点H1=(-a,-b,-c)
2)令平移后的新坐标系绕x’轴逆时针旋转90度角,则形体上的点顺时针旋转90度
3)再将新坐标系绕y’顺时针旋转 角,此时 大于180度,形体上的点逆时针旋转 角, 记
4)再令新坐标系绕x’轴顺时针旋转 角,形体上的点逆时针旋转 角,
5)右手坐标系变成左手坐标系,z轴反向
从观察位置(6,8,7.5)向原点方向进行观察
设有一个中心在原点,边长为2的正方体,经H变换到观察坐标系
取投影平面过世界坐标系原点,且与ZV轴垂直的平面, 投影中心(观察位置)在原点 投影矩阵为:
投影总结: 1平行投影 1)正交 2)斜交:斜二测,斜等轴 2透视投影 1)单点 2)双点 3)三点
第六节 裁剪 裁剪就是去掉窗口外的不可见部分, 假设窗口的两个对角顶点分别是 、 ,则同时满足下列不等式的点 是要保留的点,否则就要被舍弃: 保留窗口内的可见部分的过程。 裁剪区域:矩形、任意图形 裁剪对象:点、线段、多边形、 二维或三维形体 假设窗口的两个对角顶点分别是 、 ,则同时满足下列不等式的点 是要保留的点,否则就要被舍弃:
直线段裁剪算法 1. Cohen-Sutherland算法 对象的可见性问题: ①判断直线段完全可见,是,绘制,结束,保留 直线段裁剪算法 1. Cohen-Sutherland算法 对象的可见性问题: ①判断直线段完全可见,是,绘制,结束,保留 ②判定完全不可见,是,不绘制,结束,舍弃 ③ ① ②都不满足,部分可见,求线段与窗口边 界线的交点(分割),对子线段继续① ~ ③
算法步骤如下: 1.编码: 每个区域用一个4位二进制编码来标识,代码确定如下: 第1位为1:若区域在窗口上方 2 下方 3 右侧 4 左侧 设线段的两个端点p1(x1,y1),p2(x2,y2),求出p1,p2所处区域的代码c1和c2
2.判别: ⑴c1=c2=0,完全可见,保留, AB ⑵C1&C2!=0 完全不可见,舍弃 CD ⑶ 不满足⑴ ⑵可分为三种情况 ① 一个端点在内另一个端点在外 EF ② 两个端点都在外,且直线段在外JK ③ 两个端点都在外,但直线中部跨越窗口 HI
3.求交。 求线段与窗口边界及其延长线的交点 将 ,代入上式,求出交点坐标 4. 对剩下的子线段重复以上各步,从而完成对直线段的裁剪
算法的程序实现如下 void Cohen_Sutherland(double x0, y0, x2, y2) { int c, c1, c2; double x, y; makecode(x0, y0,c1); makecode(x2, y2, c2); while (c1!=0 || c2!=0) if (c1&c2!=0) return; c=c1; if (c==0) c=c2;
if (c&1==1) {y=y0+(y2-y0)*(x1-x0)/(x2-x0); x=x1;} else if (c&2==2) {y=y0+(y2-y0)*(xr-x0)/(x2-x0); x=xr;} else if (c&4==4) {x=x0+(x2-x0)*(yb-y0)/(y2-y0); y=yb;} else if (c&8==8) {x=x0+(x2-x0)*(yt-y0)/(y2-y0); y=yt;} if (c==c1) {x0=x; y0=y; makecode(x, y, c1);} else {x2=x; y2=y; makecode(x, y, c2);} } showline(x0, y0, x2, y2); //显示可见线段}
void makecode(double x, y; int c) { c=0; if (x<xl) c=1; else if (x>xr) c=2; if (y<yb) c=c+4; else if (y>yt) c=c+8; }
2.中点分割算法 基本思想:可分成两个过程平行进行, 从p0点出发找出离点p0 最近的可见点, 从p1点出发找出离点 p1 最近的可见点。 这两个最近可见点的连线就是原直线段的可 见部分。 p0p1->mid(p0,p1)=pm->mid(p0,pm) ->mid(pm,p1) 1)完全可见,绘制线段 2)完全不可见:线段不绘制,舍弃 3)求中点pm,分割成p0pm,pmp1,在分别进行判断 直到
3.梁友栋-Barsky算法 设要裁剪的直线段为P0P1,Pi的坐标为(xi,yi),i=0,1。 P0P1和窗口边界交于A、B、C和D四个点。该算法的基本思想是从A、B和P0三点中找出最靠近P1的点,在图3.29中该点是P0。从C、D和P1点中找出最靠近P0的点,在图3.29中该点是点C。那么就是线段上的可见部分
写成参数方程: 把窗口边界的四条边分成两类,一类称为始边,另一类称为终边。 当 时,称 为始边, 为终边。当 时,则称 为始边, 为终边。
求出 和两条始边的交点的参数 ,令: 求出 和两条终边的交点的参数 ,令: 当 时,参数方程中参数的线段就是的可见部分。当 时,整个直线段为不可见
为了确定始边和终边,并求出 与它们的交点,可采用如下方法,令: 交点的参数为:
当 时,求得的 必定是 和始边的交点的参数。当 时, 则是 和终边的交点的参数。 时, 若 ,则p0p1是完全不可见的(如图3.30中的直线段AB,使 )。 时,如CD,
算法的程序实现如下 函数L_Barsky实现算法 函数cansee用于判断直线段是否可见。 double xl, xr, yt, yb; (窗口位置) void L_Barsky(double x0, y0, x2, y2) { double t0, t1, deltax, deltay; t0=0.0; t1=1.0; deltax=x2-x0; if (!cansee(-deltax, x0-x1, t0, t1)) return;
if (!cansee(deltax, xr-x0, t0, t1)) return; deltay=y2-y0; if (!cansee(-deltay, y0-yb, t0, t1)) return; if (!cansee(deltay, yt-y0, t0, t1)) return; x2=x0+t1*deltax; y2=y0+t1*deltay; x0=x0+t0*deltax; y0=y0+t0*deltay; showline(x0, y0, x2, y2); //显示可见线段 }
bool cansee(double q, d, t0, t1) { double r; if (q<0) { r=d/q; if (r>tl) {cansee=false; return;} else if (r>t0) t0=r; } else if (q>0) if (r<t0) {cansee=false; return;} else if (r<t1) t1=r; else if (d<0) {cansee=false; return;} cansee=true;
其它图形的裁剪 字符、多边形、圆弧和任意曲线 多边形裁剪后,一部分窗口的边界有可能成为裁剪后多边形的边界,而一个凹多边形裁剪后可能成为几个多边形
对多边形的裁剪可以采用Sutherland-Hodgman算法,只要对多边形用窗口的四条边裁剪四次就可得到裁剪后的多边形
裁剪区域为任意凸多边形区域时的直线段的裁剪算法 1.计算所要裁剪的直线段所在直线与凸多边形区域的边界直线段的交点。 2.当交点的个数为0或1时,该直线段处于凸多边形区域外 3. 当交点的个数为2时,通过判断这两个交点与被裁剪的直线段的端点在直线段所处的直线上的关系来进行裁剪。 1). 如果直线段的两个端点和两个交点刚好全部重合,则显而易见该直线段完全可见。 2). 如果直线段的两个端点和两个交点中有一个
重合,则将重合的点视为一点,则将重合点与另外的一个端点、一个交点按在直线上的顺序排列。根据排列的顺序有如下三种情况: ①重合点和交点不相邻,则直线段完全可见; ②如果重合点与交点相邻,且该交点与另一个端点 相邻,则直线段部分可见,且可见部分为重合点 与另一个交点确定的直线段,它的可见部分为直 线段; ③如果重合点与交点相邻,且该交点与另一个端点 不相邻,则直线段完全不可见。
3)如果直线段的两个端点和两个交点都不重合。将这四个点按在直线上的顺序排列,根据排列的顺序有如下四种情况: ①如果两个端点和两个交点分别相邻,则直线段完全不可见; ②如果两个端点在两个交点之间,则直线段完全可见; ③如果两个交点在两个端点之间,则直线段部分可见,且可见部分为两个交点决定的直线段,它的可见部分为直线段; ④如果交点和端点的排列顺序是交错的,则直线段部分可见,且可见部分为中间的一个交点和一个端点决定的直线段,它的可见部分为直线段 。
三维图形的裁剪
Cohen-Sutherland算法推广至三维时,用于判断显然不可见的线段的编码应为六位,这六位的安排是: 点在视域上面,第一位为1,y>1(y>z) 点在视域下面,第二位为1,y<0(y<-z) 点在视域右面,第三位为1,x>1(x>z) 点在视域左面,第四位为1,x<0(x<-z) 点在视域后面,第五位为1,z>1(z>1) 点在视域前面,第六位为1,z<0 (z<zmin )
设直线段的起点和终点分别为 和 ,直线方程可以表示成如下的参数方程形式: y=1求交时,可由下式求得:
直线段和平面x=z的交点,可得出交点处的参数为:
梁友栋-Barsky算法也可以推广到三维情况下。当视域为立方体时,这种推广是直接的。当视域为棱台时,对于 , , 四个平面来说,对应于二维裁剪时的 值和 值可如下取值:
对z=1和z= zmin两个平面,相应的 值和 值可如下取值: 其中, , 和 。可知,相应平面与 的交点的参数值为,。