410 likes | 550 Views
Computer Graphics. 第五章 二维变换和裁剪 (2). 本章内容 -2. 5.4 二维图形裁剪 5.5 Cohen-Sutherland 直线裁剪算法 5.6 中点分割直线段裁剪算法 5.7 梁友栋- Barsky 直线段裁剪算法. 5.4 二维图形裁剪. 5.4.1 图形学中常用的坐标系 5.4.2 窗口和视区及窗视变换 5.4.3 窗视变换矩阵 5.4.4 点的裁剪. 5.4.1 图形学中常用的坐标系. 计算机图形学中常用的坐标系有用户坐标系、观察坐标系、设备坐标系和规格化设备坐标系等。.
E N D
Computer Graphics 第五章 二维变换和裁剪(2)
本章内容-2 5.4 二维图形裁剪 5.5 Cohen-Sutherland直线裁剪算法 5.6 中点分割直线段裁剪算法 5.7 梁友栋-Barsky直线段裁剪算法
5.4 二维图形裁剪 5.4.1 图形学中常用的坐标系 5.4.2 窗口和视区及窗视变换 5.4.3 窗视变换矩阵 5.4.4 点的裁剪
5.4.1 图形学中常用的坐标系 计算机图形学中常用的坐标系有用户坐标系、观察坐标系、设备坐标系和规格化设备坐标系等。
1.用户坐标系(User Coordinate ,UC) 用户定义原始图形所采用的坐标系称为用户坐标系。用户坐标系通常根据应用的需要可以选择直角坐标系、圆柱坐标系、球坐标系以及极坐标系等等。图5-17所示为常用的二维和三维用户直角坐标系。 5-17 二维和三维用户坐标系
2.观察坐标系(View Coordinate ,VC) 依据观察窗口的方向和形状在用户坐标系中定义的坐标系称为观察坐标系,观察坐标系用于指定图形的哪一部分可以输出范围。 5-18 观察坐标系
3.设备坐标系 (Device Coordinate ,DC) 显示器等图形输出设备自身都有一个坐标系称为设备坐标系,也称为屏幕坐标系。设备坐标系是二维坐标系,原点位于屏幕左上角,x轴垂直向右,y轴垂直向下,基本单位为像素。 5-19 设备坐标系 5-20 规格化设备坐标系
4.规格化设备坐标系 (Normalized Device Coordinate ,NDC) 规格化设备坐标系是将设备坐标系规格化到(0.0,0.0)到(1.0,1.0)的范围内而定义的坐标系。规格化设备坐标系独立于具体输出设备。一旦图形变换到规格化设备坐标系中,只要作一个简单的乘法运算即可映射到具体的设备坐标系中。由于规格化设备坐标系能统一用户各种图形的显示范围,故把用户图形变换成规格化设备坐标系中的统一大小标准图形的过程叫作图形的逻辑输出。把规格化设备坐标系中的标准图形送到显示设备上输出的过程叫作图形的物理输出。有了规格化设备坐标系后,图形的输出可以在抽象的显示设备上进行讨论,因而这种图形学又称为与具体设备无关的图形学。
5.4.2 窗口和视区及窗视变换 在观察坐标系中定义的确定显示内容的区域称为窗口。显然此时窗口内的图形是用户希望在屏幕上输出的,窗口是裁剪图形的标准参照物。 在设备坐标系中定义的输出图形的区域称为视区。视区和窗口的大小可以不相同。一般情况下,用户把窗口内感兴趣的图形输出到屏幕上相应的视区内。在屏幕上可以定义多个视区,用来同时显示不同的窗口内的图形信息,图5-21定义了三个窗口内容用于输出,图5-22的屏幕被划分为三个视区,对三个窗口内容进行了重组。
5-21三个窗口 5-22 三个视区 图形输出需要进行从窗口到视区的变换,只有窗口内的图形才能在视区中输出,并且输出的形状要根据视区的大小进行调整,这称为窗视变换(Window Viewport Transformation,WVT)。在二维图形观察中,可以这样理解,窗口相当于一个一扇窗户,窗口内的图形是希望看到的,就在视区中输出,窗口外的图形不希望看到,不在视区中输出,因此需要对窗口中输出的二维图形进行裁剪。
在计算机图形学术语中,窗口最初是指要观察的图形区域。但是随着Windows的出现,窗口概念已广泛用于图形系统中,泛指任何可以移动,改变大小、激活或变为无效的屏幕上的矩形区域。在本章中,窗口回归到其的原始定义,是在观察坐标系中确定输出图形范围的矩形区域。在计算机图形学术语中,窗口最初是指要观察的图形区域。但是随着Windows的出现,窗口概念已广泛用于图形系统中,泛指任何可以移动,改变大小、激活或变为无效的屏幕上的矩形区域。在本章中,窗口回归到其的原始定义,是在观察坐标系中确定输出图形范围的矩形区域。
5.4.3 窗视变换矩阵 窗口和视区的边界定义如图5-23所示,假定把窗口内的一点P(xw,yw)变换为视区中的一点P’(xv,yv)。这属于相对于任一参考点的二维几何变换,变换步骤为: 5-23窗口和视区的定义
1.将窗口左下角点(wxl,wyb)平移到观察坐标系原点1.将窗口左下角点(wxl,wyb)平移到观察坐标系原点 2. 对原点进行比例变换,使窗口的大小和视区大小相等,将窗口变换为视区 其中
3. 进行反平移,将视区的左下角点平移到设备坐标系的(vxl,vyb)点 因此,窗视变换矩阵为: 代入,Sx和Sy的值,窗视变换矩阵为:
写成方程为: 令 则窗视变换的展开式为: (5-12)
点的裁剪 • 图形裁剪中最基本的问题。 • 假设窗口的左下角坐标为(xL,yB),右上角坐标为(xR,yT),对于给定点P(x,y),则P点在窗口内的条件是要满足下列不等式:xL <= x <= xR • 并且yB <= y <= yT否则,P点就在窗口外。 (xR,yT ) (xL,yB )
直线段裁剪 ——直线求交算法
5.5 COHEN-SUTHERLAND直线裁剪算法 5.5.1 编码原理 5.5.2 裁剪步骤 5.5.3 交点计算公式
在二维观察中,需要在观察坐标系下根据窗口大小对用户坐标系中的二维图形进行裁剪(clipping),只将位于窗口内的图形变换到视区输出。直线的裁剪是二维图形裁剪的基础,裁剪的实质是判断直线是否与窗口相交,如相交则进一步确定位于窗口内的部分。在二维观察中,需要在观察坐标系下根据窗口大小对用户坐标系中的二维图形进行裁剪(clipping),只将位于窗口内的图形变换到视区输出。直线的裁剪是二维图形裁剪的基础,裁剪的实质是判断直线是否与窗口相交,如相交则进一步确定位于窗口内的部分。
5.5.1 编码原理 Cohen-Sutherland直线裁剪算法是最早流行的编码算法。每条直线的端点都被赋予一组四位二进制代码,称为区域编码(Region Code,RC),用来标识直线端点相对于窗口边界及其延长线的位置。假设窗口是标准矩形,由上(y=wyt)、下(y=wyb)、左(x=wxl)、右(x=wxr)四条边组成,如图5-24所示。延长窗口四条边形成9个区域,如图5-25所示。这样根据直线的任一端点P(x,y)所处的窗口区域位置,可以赋予一组4位二进制区域码RC=C4C3C2C1。
5-24 窗口坐标 5-25 区域编码 为了保证窗口内直线端点的编码为零,编码规则定义如下: 第一位:若端点位于窗口之左侧,即x<wxl,则C1=1,否则C1=0。 第二位:若端点位于窗口之右侧,即x>wxr,则C2=1,否则C2=0。 第三位:若端点位于窗口之下侧,即y<wyb,则C3=1,否则C3=0。 第四位:若端点位于窗口之上侧,即y>wyt,则C4=1,否则C4=0。
5.5.2 裁剪步骤 若直线的两个端点的区域编码都为零,即RC1|RC2=0(二者按位相或的结果为零,即RC1=0且RC2=0),说明直线两端点都在窗口内,应“简取”之。 若直线的两个端点的区域编码都不为零,即RC1&RC2≠0(二者按位相与的结果不为零,即RC1≠0且RC2≠0,即直线位于窗外的同一侧,说明直线的两个端点都在窗口外,应“简弃”之。
若直线既不满足“简取”也不满足“简弃”的条件,直线必然与窗口相交,需要计算直线与窗口边界的交点。交点将直线分为两段,其中一段完全位于窗口外,可“简弃”之。对另一段赋予交点处的区域编码,再次测试,再次求交,直至找到确定完全位于窗口内的直线段为止。 实现时,一般按固定顺序左(x=wxl),右(x=wxr)、下(y=wyb)、上(y=wyt)求解窗口与直线的交点。
如何判定应该与窗口的哪条边求交? 编码中对应位为1的边。 编码 线段裁剪
5.5.3 交点计算公式 对于端点坐标为P1(x1,y1)和P2(x2,y2)的直线,与窗口左边界(x=wxl)或右边界(x=wxr)交点的y坐标的计算公式为: (5-13) 其中 与窗口上边界(y=wyt)或下边界(y=wyb)交点的x坐标的计算公式为: (5-14) 其中
5.6中点分割直线段裁剪算法 5.6.1 中点分割算法原理 5.6.2 中点计算公式
5.6.1 中点分割算法原理 Cohen-Sutherland裁剪算法提出对直线段端点进行编码,并把直线段与窗口的关系划分为三种情况,对前两种情况进行了“简取”和“简弃”的简单处理。对于第三种情况,需要根据公式(5-13)和(5-14)计算直线段与窗口边界的交点。中点分割算法对第三种情况做了改进,不需要求解直线段与窗口边界的交点就可以对直线段进行裁剪。
中点分割直线段裁剪算法原理是简单地把直线段等分为两段直线,对每一段直线重复“简取”和“简弃”的处理,对于不能处理的直线段再继续等分为两段直线,直至每一段完全能够被“简取”或“简弃”,也就是说直至每段直线完全位于窗口之内或完全位于窗口之外,就完成了直线段的裁剪工作。直线段中点分割裁剪算法是采用二分算法的思想来逐次计算直线段的中点以逼近窗口边界。中点分割算法的计算过程只用到了加法和移位运算,易于使用硬件实现。
中点分割算法-求线段与窗口的交点 • 从P0出发找距离P0最近可见点采用中点分割方法 • 先求出P0P1的中点Pm, • 若P0Pm不是显然不可见的,并且P0P1在窗口中有可见部分,则距P0最近的可见点一定落在P0Pm上,所以用P0Pm代替P0P1; • 否则取PmP1代替P0P1。 • 再对新的P0P1求中点Pm。重复上述过程,直到PmP1长度小于给定的控制常数为止,此时Pm收敛于交点。 • 从P1出发找距离P1最近可见点采用上面类似方法。
5.6.2 中点计算公式 对于端点坐标为P0(x0,y0),P1(x1,y1)的直线段,中点坐标的计算公式为: (5-15)
对分辩率为2N*2N的显示器,上述二分过程至多进行N次。对分辩率为2N*2N的显示器,上述二分过程至多进行N次。 • 主要过程只用到加法和除法运算,适合硬件实现,它可以用左右移位来代替乘除法,这样就大大加快了速度。
5.7 梁友栋-BARSKY算法 • 设要裁剪的线段是P0P1。 P0P1和窗口边界交于A,B,C,D四点,见图。算法的基本思想是从A,B和P0三点中找出最靠近P1的点,图中要找的点是P0。从C,D和P1中找出最靠近P0的点。图中要找的点是C点。那么P0C就是P0P1线段上的可见部分。
梁友栋-BARSKY算法 线段的参数表示 x=x0+t△x y=y0+t△y 0<=t<=1 △x=x1-x0 △y=y1-y0 窗口边界的四条边分为两类:始边和终边。
求出P0P1与两条始边的交点参数t0, t1 , 令tl=max(t0 ,t1,0),则tl即为三者中离P1最近的 点的参数 求出P0P1与两条终边的交点参数t2, t3, 令tu=min(t2,t3,1) ,则tU即为三者中离P0最近的 点的参数 若tu > tl,则可见线段区间 [tl , tu] 梁友栋-BARSKY算法:交点计算
梁友栋-BARSKY算法 始边和终边的确定及交点计算: 令 QL= - △x DL= x0-xL QR= △x DR= xR-x0 QB= - △y DB= y0-yB QT= △y DT= yT-y0 交点为 ti= Di /Qi i=L,R,B,T Qi <0 ti为与始边交点参数 Qi >0 ti为与终边交点参数 Qi =0 Di <0 时,线段不可见 Di >0 时, 分析另一D, E A B F
梁友栋-BARSKY算法 当Qi =0时 若Di <0 时,线段不可见 (如图中AB,有QR=0,DR<0) 若Di >0 时, 分析另一D, (如图中的EF就是这种情况,它使QL=0,DL>0和QR=0,DR>0。这时由于EF和x=xL及x=xR平行,故不必去求出EF和x=xL及x=xR的交点,而让EF和y=yT及y=yB的交点决定直线段上的可见部分。) E A B F
小结 二维变换需要读者掌握基本几何变换矩阵。二维图形基本几何变换的平移、比例、旋转、反射和错切是仿射变换的特例,反过来,任何仿射变换 总可以表示为这五种变换的组合。
二维裁剪属于二维观察的内容,本章给出了三种直线裁剪算法,其中Cohen-Sutherland算法是最着名的直线裁剪算法,创新性地提出了直线端点的编码规则,但这种算法需要计算直线和窗口的交点;中点分割裁剪算法避免了求解直线和窗口边界的交点,只需计算直线中点坐标就可以完成直线的裁剪。梁友栋-Barsky算法是效率最高的直线裁剪算法,通过参数t的计算,把二维裁剪问题转化成一维裁剪问题,直线的裁剪转化为求解一组不等式的问题。二维裁剪属于二维观察的内容,本章给出了三种直线裁剪算法,其中Cohen-Sutherland算法是最着名的直线裁剪算法,创新性地提出了直线端点的编码规则,但这种算法需要计算直线和窗口的交点;中点分割裁剪算法避免了求解直线和窗口边界的交点,只需计算直线中点坐标就可以完成直线的裁剪。梁友栋-Barsky算法是效率最高的直线裁剪算法,通过参数t的计算,把二维裁剪问题转化成一维裁剪问题,直线的裁剪转化为求解一组不等式的问题。
习题5.2 4.用编码裁剪算法裁剪线段P1(0,2),P2(3,3),裁剪窗口为wxl=1,wxr=6,wyb=1,wyt=5,如图5-31所示。要求写出:(1)窗口边界划分的9个区间的编码原则。(2)线段端点的编码。(3)裁剪的主要步骤。(4)裁剪后窗口内直线段的端点坐标。 P2 P1 图5-31 直线段裁剪
5.窗视变换公式也可以使用窗口和视区的相似原理进行推导,但要求点P(xw,yw)在窗口中的相对位置等于点P’( xv,yv)在视区中的相对位置,请推导以下的窗视变换公式: 变换系数为: