Download - Computer Graphics
ComputerGraphics
第五章 二维变换和裁剪 (2)
5.4 二维图形裁剪5.5 Cohen-Sutherland直线裁剪算法
5.6 中点分割直线段裁剪算法5.7 梁友栋-Barsky直线段裁剪算法
本章内容 -2
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
的出现,窗口概念已广泛用于图形系统中,泛指任何可以移动,改变大小、激活或变为无效的屏幕上的矩形区域。在本章中,窗口回归到其的原始定义,是在观察坐标系中确定输出图形范围的矩形区域。
5.4.3 窗视变换矩阵
窗口和视区的边界定义如图 5-23所示,假定把窗口内的一点 P ( xw , yw) 变换为视区中的一点 P’ ( xv , yv )。这属于相对于任一参考点的二维几何变换,变换步骤为:
5-23 窗口和视区的定义
1.将窗口左下角点( wxl, wyb)平移到观察坐标系原点
1 0 0
0 1 0
1xl yb
T
w w
平移
2. 对原点进行比例变换,使窗口的大小和视区大小相等,将窗口变换为视区
100
00
00
y
x
S
S
T比例 其中
xr xlx
xr xl
yt yby
yt yb
v vS
w w
v vS
w w
3. 进行反平移,将视区的左下角点平移到设备坐标系的( vxl , vyb )点
1 0 0
0 1 0
1xl yb
T
v v
反平移
因此,窗视变换矩阵为:1 0 0 0 0 1 0 0
0 1 0 0 0 0 1 0
1 0 0 1 1
x
y
xl yb xl yb
S
T T T T S
w w v v
平移 反平移比例
代入, Sx 和 Sy 的值,窗视变换矩阵为:
0 0
[ 1] [ 1] 0 0
1
x
v v w w y
xl xl x yb yb y
S
x y x y S
v w S v w S
写成方程为:
v x w xl xl x
v y w yb yb y
x S x v w S
y S y v w S
xr xlx
xr xl
xl xl
yt yby
yt yb
yb yb
v va S
w w
b v w a
v vc S
w w
d v w c
令
则窗视变换的展开式为:
dycy
bxax
wv
wv ( 5-12 )
点的裁剪点的裁剪 图形裁剪中最基本的问题。 假设窗口的左下角坐标为(xL,yB),右上角坐标为(xR,yT) ,对于给定点P(x,y),则 P 点在窗口内的条件是要满足下列不等式:xL <= x <= xR
并且 yB <= y <= yT
否则, P 点就在窗口外。
(xL,yB )
(xR,yT )
直线段裁剪直线段裁剪———— 直线求交算法直线求交算法
5.5 COHEN-SUTHERLAND直线裁剪算法
5.5.1 编码原理5.5.2 裁剪步骤5.5.3 交点计算公式
在二维观察中,需要在观察坐标系下根据窗口大小对用户坐标系中的二维图形进行裁剪( 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 。
0000
wyb
wyt
wxrwxl
窗口
1000 1010
001000000001
0101
1001
01100100
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=wy
b )、上( y=wyt)求解窗口与直线的交点。
1001 1000 1010
0001 0000 0010
0101 0100 011 0
P 1
P 2
P 3
P 4
如何判定应该与窗口的哪条边求交? 编码中对应位为 1 的边。
编码 线段裁剪
5.5.3 交点计算公式对于端点坐标为 P1 ( x1 , y1) 和 P2 ( x2 , y
2 )的直线,与窗口左边界( x = wxl )或右边界( x = wxr )交点的 y 坐标的计算公式为:
11)( yxxky
)/()( 1212 xxyyk 其中与窗口上边界( y = wyt )或下边界( y = wy
b )交点的 x 坐标的计算公式为:
11 x
k
yyx
)/()( 1212 xxyyk 其中
( 5-13 )
( 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 最近可见点采用上面类似方法。P 0
P 1
PmA
B
5.6.2 中点计算公式
0 1( ) / 2x x x
0 1( ) / 2y y y
对于端点坐标为P0 ( x0 , y0) , P1 ( x1 , y1)的直线段,中点坐标的计算公式为:
( 5-15 )
对分辩率为 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
窗口边界的四条边分为两类:始边和终边。
为始边。为终边,若为终边。为始边,若
为始边。为终边,若为终边。为始边,若
TB
TB
RL
RL
yyyyy
yyyyy
xxxxx
xxxxx
0
0
0
0
求出 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
F
A
B
梁友栋 -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
F
A
B
小结 二维变换需要读者掌握基本几何变换矩阵。二维图形基本几何变换的平移、比例、旋转、反射和错切是仿射变换的特例,反过来,任何仿射变换
总可以表示为这五种变换的组合。
ndycxy
mbyaxx
'
'
二维裁剪属于二维观察的内容,本章给出了三种直线裁剪算法,其中 Cohen-Sutherland算法是最着名的直线裁剪算法,创新性地提出了直线端点的编码规则,但这种算法需要计算直线和窗口的交点;中点分割裁剪算法避免了求解直线和窗口边界的交点,只需计算直线中点坐标就可以完成直线的裁剪。梁友栋- Barsky算法是效率最高的直线裁剪算法,通过参数 t 的计算,把二维裁剪问题转化成一维裁剪问题,直线的裁剪转化为求解一组不等式的问题。
4.用编码裁剪算法裁剪线段P1(0, 2), P2(3, 3),裁剪窗口为wxl=1, wxr=6, wyb=1, wyt=5,如图5-31所示。要求写出:( 1 )窗口边界划分的 9 个区间的编码原则。( 2 )线段端点的编码。( 3 )裁剪的主要步骤。( 4 )裁剪后窗口内直线段的端点坐标。
P1
P2
图 5-31 直线段裁剪
习题习题 5.25.2
5.窗视变换公式也可以使用窗口和视区的相似原理进行推导,但要求点 P ( xw, yw)在窗口中的相对位置等于点 P’( xv, yv)在视区中的相对位置,请推导以下的窗视变换公式:
dycy
bxax
wv
wv
cwybvybd
wybwyt
vybvytSc
awxlvxlbwxlwxr
vxlvxrSa
y
x
变换系数为: