当前位置:
文档之家› 开发动态Web网站的几种技术
开发动态Web网站的几种技术
即有:
u ( x1 x2 ) x1 wxl u ( x2 x1 ) wxr x1 u ( y1 y2 ) y1 wyb u ( y2 y1 ) wyt y1
(5)按左、右、下、上的顺序求出直线段与窗口边 界的交点,并用该交点的坐标值替换P1的坐标值。
也就是在交点,假定为S,S处把线段一分为二,并 去掉P1S这一段(考虑到P1是窗口外的一点,因此可 以去掉P1S转(2))。 (6)画出当前的直线段P1 P2 。
(7)算法结束 。
下面根据该算法步骤来裁剪如图所示的直线段P1P2 :
(2)对P1、P2编码:点P1的编码为code1,点P2的 编码为code2。
(3)若code1|code2=0,对直线段应简取之,转(6 );否则,若code1&code2≠0,对直线段可简弃之 ,转(7);当上述两条均不满足时,进行步骤(4) 。 (4)确保P1在窗口外部:若P1在窗口内,则交换 P1和P2的坐标值和编码。
由于P1(原P3)已在窗口内,交换P1、P2的坐标值 和编码,按左、右、下、上的顺序求出P1P2与窗口下 边界的交点P4 ,丢弃P1(原P2)P4 。
剩下的直线段(P3P4)再进行进一步判断, code1|code2=0,全在窗口中,简取之。
Cohen-Sutherland算法用编码的方法实现了对完 全可见和不可见直线段的快速接受和拒绝。比较适合 两种情况:一是大部分线段完全可见;二是大部分线 段完全不可见。
首先对P1P2进行编
1001
1000
1010
码, P1的编码code1 为0001,P2的编码 code2为0100。由于
P1 0001 P3 0000
0010
code1|code2≠0,
P4
且code1&code2=0 ,因此对直线段P1P2 既不能简取也不能简 弃,故进行求交处理
0101
0100
1000
1010
端点p1和p2的编码code1
和code2,然后进行处理 0001
0000
0010
:(1)若
窗口
code1|code2=0,对 0101
0100
0110
直(线2)段若应c简od取e1之&。code2≠0, 对直线段可简弃之。
D3D2D1D0
窗口及区域编码
这是因为若code1和code2经按位与运算后的结果 不为0,说明两个端点同在窗口的上方、下方、左方 或右方。
1、Cohen-Sutherland算法
本算法又称为编码裁剪算法,算法的基本思想是对 每条直线段p1(x1,y1),p2(x2,y2)分三种情况处理: a、若点p1和p2完全在裁剪窗口内,则该直线段完全 可
b、见若,点“p简1和取p”2均之在。窗口外,且满足下列4个条件之一 ,
直线段完全x不1可w见x,l且“x简2 弃”w之xl。 x1 wxr且x2 wxr y1 wyb且y2 wyb y1 wyt且y2 wyt
c、直线段既不满足“简取”的条件,也不满足“简弃 ”
的条件,需要对直线段按交点进行分段,分段后
算重法复具上体述实处现理是。:每条线段的端点都赋以四位二进制 码D3D2D1D0 ,称为区域码,用来标识出端点相对于 裁剪矩形边界的位置。编码规则如下:
若 x<wxl , 则 D0=1 , 否 则 D0=0 ; 若 x>wxr , 则 D1=1 , 否 则D1=0 ; 若 y<wyb , 则 D2=1 , 否 则 D2=0 ; 若y>wyt ,则D3=1,否则D3=0。
(3)若上述两条件均不成立。则需求出直线段与窗 口边界的交点。在交点处把线段一分为二,其中必有 一段完全在窗口外,可以弃之。再对另一段重复进行 上述处理,直到该线段完全被舍弃或者找到位于窗口 内的一段线段为止。
实现时,一般按固定顺序检查直线段端点的编码位 是否为0。这里按左、右、下、上的顺序。与窗口边 界求交的顺序也可以任意选择,这里也按左(x=wxl )、右(x=wxr)、下(y=wyb)、上(y=wyt) 的顺序进行。
x x1 u (x2 x1) y y1 u ( y2 y1) 0 u 1
其中,(x,y)为直线上任意一点。如果直线上一点 (x,y)位于由坐标(x,y)和(x,y)所确定的窗口内 ,则有下式成立:
wxl x1 u (x2 x1) wxr wyb y1 u ( y2 y1) wyt
对于端点坐标为(x1,y1)和(x2,y2)的直线, 与左、右边界交点的y坐标可以这样计算:
y y1 k(x x1) 其中,x为wxl或wxr,线段的斜率为:
k y2 y1 x2 x1
与上、下边界交点的x坐标可以这样计算:
x
x1
y
k
y1
其中,y为wyb或wyt。
下面写出Cohen-Sutherland直线段裁剪算法的步骤 : (1)输入直线段的两端点坐标: P1(x1,y1), P2(x2,y2),以及窗口的四条边界坐标:wyt、 wyb、wxl和wxr。
2、Liang-Barsky算法
在Cohen-Sutherland算法提出后,Cyrus和Beck用 参数化方法提出了针对凸多边形的裁剪算法,它比编 码算法更有效。而梁友栋和Barsky 又针对标准矩形窗 口提出了更快的Liang-Barsky直线段裁剪算法。
Liang-Barsky算法的基本出发点是直线的参数方程 。给出任一条直线段P1(x1,y1),P2(x2,y2), 其参数方程为:
0110
P2
直线段P1P2的编码裁剪
。由code1=0001知P1在窗口左外侧,按左、右、下 、上的顺序求出直线段与窗口左边界的交点为P3, P1P3必在窗口外,可简弃之。
ቤተ መጻሕፍቲ ባይዱP2P3重复上述处理(此时用原P3替换P1): P1( 原P3)的编码为0000,P2编码为0100,因此对直线段 P1P2既不能简取也不能简弃。
区域码的各位指出端点对于裁剪窗口的四个相对坐 标位置:左、右、下、上。将区域码各位从右到左编 号,则坐标区域与各位的关系为:
位1:左
位2:右
位3:下
位4:上
任何位赋值为1,代表端点落在相应的位置上,否则 该位置为0。
根据该编码规则,窗口及其延长线所构成的9个区域 的编码如图所示。
裁剪一条线段时,先求出 1001