500 likes | 648 Views
二维图形裁剪. 《 计算机图形学 》 教案. 孙正兴 博士. ☆ 二维裁剪定义 ◘ 二维裁剪时机 ☆点的裁剪 ☆线段裁剪 ● 线段裁剪举例 ● 线段编码裁剪 ● 梁 -Barsky 裁剪 ● NLN 直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法. 二维裁剪定义. 裁剪 : 识别图形在指定区域内、外部分的过程 。 裁剪窗口 :用来裁剪对象的区域。 对不同应用,裁剪窗口可是多边形或曲线边界。 裁剪的应用包括: 从定义的场景中抽取出用于观察的部分; 在三维视图中标识出可见面;
E N D
《计算机图形学》教案 孙正兴 博士 ☆二维裁剪定义 ◘ 二维裁剪时机 ☆点的裁剪 ☆线段裁剪 ● 线段裁剪举例 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法 二维裁剪定义 • 裁剪:识别图形在指定区域内、外部分的过程。 • 裁剪窗口:用来裁剪对象的区域。 • 对不同应用,裁剪窗口可是多边形或曲线边界。 • 裁剪的应用包括: • 从定义的场景中抽取出用于观察的部分; • 在三维视图中标识出可见面; • 防止线段或对象的边界混淆; • 用实体造型来创建对象; • 显示多窗口的环境; • 允许选择图形的一部分来进行拷贝、移动或删除等绘图操作。 裁剪窗口
☆二维裁剪定义 ◘ 二维裁剪时机 ☆点的裁剪 ☆线段裁剪 ● 线段裁剪举例 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法 二维裁剪时机选择 • 裁剪算法可用于世界坐标系中, • 世界坐标系下的裁剪只有窗口内的部分映射到设备空间中,而将落在窗口外的图形部分删除。 • 裁剪算法也可将世界坐标系的图形首先映射到设备坐标系或规格化设备坐标系中,然后用视区边界裁剪。 • 视区裁剪可通过合并观察变换和几何变换矩阵来减少计算。 • 视区裁剪需要对所有对象(包括窗口之外的部分)变换到设备坐标系。 • 在光栅系统中,裁剪算法需与扫描转换结合。 窗口 视区 Y世界 Y设备 X世界 X设备
设裁剪位置是一个在标准位置的矩形, 如果点P=(x,y)满足下列不等式,则保存点P: xwmin≤x≤xwmax; ywmin≤y≤ywmax。 其中:(xwmin,xwmax,ywmin,ywmin)是世界坐标系的窗口边界或视区边界。 如果四个不等式中有任何一个不满足,则该点被裁剪掉(不被存储和显示)。 Y ymax ymin xmin xmax X P1(x,y) P(x,y) ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段裁剪举例 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法 二维裁剪:点的裁剪 • 某些应用需要点的裁剪过程 • 例如,点的裁剪可以用于爆炸或海面泡沫的显示,它们通过场景中分散的粒子建模。
线段裁剪处理的基础有两个方面: 给定线段与裁剪窗口的相互位置关系测试,包括: 完全在裁剪窗口之内; 显然完全在窗口之外; 至少一个端点在窗口外,但并非显然在窗口外。 给定线段与一个或多个裁剪边界的交点计算。 问题:需要大量的计算 裁剪前 裁剪 裁剪后 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段裁剪举例 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法 二维裁剪:线段裁剪 • 裁剪就是要在减少计算量的基础上有效识别给定线段与裁剪窗口相对位置关系。 • 尤其是对不能确定的线段,要计算它与裁剪边界的交点,再通过对线段的端点进行“内-外检测”来处理线段。
线段P1P2 由下端点P1开始,依次按左、右、上、下边界对P1检查,发现端点位于裁剪窗口下。 找出线段P1P2与底边界的交点P1′,并舍弃P1到P1′之间的线段。 线段缩短到从P1′到P2之间。 P2在裁剪窗口之外,将P2用各个边界检查,发现P2位于窗口的左边,计算出交点P2′; 该点在窗口的上方,因此再做一次求交计算得到交点P2”,存储P1′到P2”的线段。该线段的裁剪就处理完毕了。 P2 P2’ P2” P1’ P3 P1 P3’ P4 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段裁剪举例 ◘ 算法举例 ◘ 算法举例(续) ● 线段编码裁剪 ◘ 区域码生成 ◘ 内外点判断 ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 线段裁剪举例
线段P3P4 线段P3P4的端点P3在裁剪矩形的左边, 求出交点P3′; 并舍弃从P3到P3′的线段。 检查从P3′到P4线段的端点区域码,发现剩下的线段在裁剪窗口以下,也应该舍弃。 P2 P2’ P2” P1’ P3 P1 P3’ P4 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ◘ 区域码生成 ◘ 内外点判断 ◘ 算法举例 ◘ 算法举例(续) ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 线段裁剪举例
与裁剪边界的交点计算 (用斜率-截距式直线方程计算) 对于端点坐标为(x1,y1)和(x2,y2)的直线, 与垂直边界交点的y坐标可由下式计算得到: y=y1+m(x-x1), 其中:x值置为xwmin或xwmax, 斜率:m=(y2-y1)/(x2-x1) 。 与水平边界交点的x坐标可由下式计算得到: x=x1+(y-y1)/m, 其中:y值置为ywmin或ywmax, 斜率:m=(y2-y1)/(x2-x1) 。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法 线段求交:截距方程
端点是(x1,y1)和(x2,y2)其中之一或两个端点都在裁剪矩形外的线段,其参数表达式为:端点是(x1,y1)和(x2,y2)其中之一或两个端点都在裁剪矩形外的线段,其参数表达式为: x = x1+u (x2-x1); y = y1+u (y2-y1)。(0≤u≤1) 该线段与裁剪边界求交时,可得出参数u值。 如果与矩形边界交点的u值不在0和1之间,则该线段不在该边界处进入窗口内; 如果u值在0和1之间,线段穿过了裁剪区。 此方法可用于各个裁剪边界,以便确定该线段的显示部分。 平行于窗口边界的线段可作为特殊情况处理。 使用参数线段裁剪法需要大量计算。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法 线段求交:参数求交
Cohen-Sutherland 算法是最早、最流行的线段裁剪算法,也称编码算法。 通过编码测试来减少要计算的交点数目。 区域通过如图所示边界设定。 每条线段的端点都赋以四位二进制码,称为区域码, 用来标识出端点相对于裁剪矩形边界的位置。 区域码的各位指出线段端点与裁剪窗口四个相对坐标位置的关系。 裁剪窗口的四个相对坐标位置:左、右、上、下; 区域码各位从右到左编号: 位1:左;位2:右;位3:下;位4:上。 任何位赋值为1代表端点落在相应位置上; 否则该位置为0。 1001 1000 1010 0000 0001 0010 窗口 0101 0100 0110 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ◘ 区域码生成 ◘ 内外点判断 ◘ 算法举例 ◘ 算法举例(续) ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 线段裁剪:Cohen-Sutherland 算法
区域码各位的值通过将端点坐标值(x,y)与裁剪边界比较来确定:区域码各位的值通过将端点坐标值(x,y)与裁剪边界比较来确定: 如果x<xwmin,则第1位置1,否则置0; 其他三位依此类推。 对于可进行位操作的语言,区域码各位的值可按下列两步确定: 计算端点坐标和裁剪边界之间的差值; 用各差值符号来设置区域码各位的值: 第1位为x-xwmin的符号位; 第2位为xwmax-x的符号位; 第3位为y-ywmin的符号位; 第4位为ywmax-y的符号位。 1001 1000 1010 0000 0001 0010 窗口 0101 0100 0110 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ◘ 区域码生成 ◘ 内外点判断 ◘ 算法举例 ◘ 算法举例(续) ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 Cohen-Sutherland 算法:区域码生成
根据线段端点的区域码,可快速判断线段是否完全在裁剪窗口内或外:根据线段端点的区域码,可快速判断线段是否完全在裁剪窗口内或外: 完全在窗口边界内的线段两个端点的区域码均为0000; 两个端点区域码同样位置都为1的线段完全在裁剪矩形外。 测试线段更好的方法是对两个端点的区域码进行逻辑与操作: 如果结果不为0000,则线段完全位于裁剪区域之外。 不能判断为完全在窗口外或窗口内的线段(可能穿过或不穿过窗口内部),要与窗口边界求交: 首先,对一条线段的外端点与一条裁剪边界比较来确定应裁剪掉多少线段; 然后,对线段的剩下部分与其它裁剪边界比较,直到该线段完全被舍弃或者找到位于窗口内的一段线段为止。 算法按左、右、上、下的顺序用裁剪边界检查线段的端点。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ◘ 区域码生成 ◘ 内外点判断 ◘ 算法举例 ◘ 算法举例(续) ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 Cohen-Sutherland 算法:内外判断
梁友栋和Barsky分别独立提出了更快的参数化线段裁剪算法。梁友栋和Barsky分别独立提出了更快的参数化线段裁剪算法。 基本认识:裁剪窗口是二维对象;线段是一维对象,两个对象维数不同不便比较。 解决思路:将待裁剪线段及裁剪矩形窗口均看作点集,那么,裁剪结果即为两点集的交集。 解决办法: 设:P1P2所在直线为L; 记:该直线(或其延长线)与裁剪窗口的两交点为Q1Q2,称为Q1Q2诱导窗口,它是一维的。 P1P2关于矩形窗口的裁剪结果与P1P2关于诱导窗口的裁剪结果是一致的 将二维裁剪问题化简为一维裁剪问题。 Q1 Q2 P1 P2 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ◘ 一维裁剪思想 ◘ 诱导窗口生成 ◘ 诱导窗口计算 ◘ 算法计算思想 ◘ 算法计算实现 ◘ 算法计算过程 ◘ 算法功用分析 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 线段裁剪:梁友栋-Barsky 裁剪算法
在一维数轴上,数轴坐标的参数表达式为: P=P1+u(P2-P1) 假设P1为数轴原点,uP1=0, uP2=1; Q1Q2的参数分别为u1、u2,且u1<u2; P1P2和Q1Q2间有四种位置关系(如表): Ⅰ:Q1P1P2Q2;(完全在窗口内) Ⅱ:P1Q1Q2P2; Ⅲ:P1P2Q1Q2或Q1Q2P1P2;(完全在窗口外) Ⅳ:P1Q1P2Q2或Q1P1Q2P2。 u2 <0 0≤u2≤1 u2>1 u1<0 Ⅲ Ⅳ Ⅰ Ⅱ Ⅳ 0≤u1≤1 Ⅲ u1>1 Q1 Q2 P1 P2 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ◘ 一维裁剪思想 ◘ 诱导窗口生成 ◘ 诱导窗口计算 ◘ 算法计算思想 ◘ 算法计算实现 ◘ 算法计算过程 ◘ 算法功用分析 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 梁-Barsky 裁剪算法:一维裁剪 • P1P2至少部分可见的充要条件为: • max(uP1, u1)≤min(uP2, u2) • 且其可见部分的区间为: • [max(uP1, u1),min(uP2, u2)]
一维问题的解得出后,为解决二维裁剪问题,只要生成诱导窗口。一维问题的解得出后,为解决二维裁剪问题,只要生成诱导窗口。 假定P1P2所在直线Line与窗口左、右、上、下四边界所在直线交点分别为:L、R、T和B; Q1Q2为诱导窗口; 记:窗口左右边界所在直线夹成的带形区域为A1; 窗口上下边界所在直线夹成的带形区域为A2; 窗口区域为Window。 A1 T Window R Q2 L A2 P2 B Q1 P1 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ◘ 一维裁剪思想 ◘ 诱导窗口生成 ◘ 诱导窗口计算 ◘ 算法计算思想 ◘ 算法计算实现 ◘ 算法计算过程 ◘ 算法功用分析 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 梁-Barsky 裁剪:诱导窗口生成
诱导窗口Q1Q2计算如下: Q1Q2 = Line∩Window=Line∩(A1∩A2) = (Line∩A1)∩(Line∩A2)=LR∩TB LR和TB分别为在水平方向和垂直方向的参数区间。 上式给出Q1Q2对应的参数区间。 P1P2的可见部分记为VW,则: VW= P1P2∩Q1Q2=P1P2∩LR∩TB P2 P1 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ◘ 一维裁剪思想 ◘ 诱导窗口生成 ◘ 诱导窗口计算 ◘ 算法计算思想 ◘ 算法计算实现 ◘ 算法计算过程 ◘ 算法功用分析 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 梁-Barsky 裁剪:诱导窗口计算 A1 T Window R Q2 A2 L TB B Q1 LR
参数化形式的裁剪条件: xwmin≤x1+u·△x≤xwmax;ywmin≤y1+u·△y≤ywmax。 可表示为:u · pk≤qk k=1,2,3,4,对应裁剪窗口左右上下边界; 参数p、q定义为: p1=△x,q1=x1-xwmin;p2=△x,q2=xwmax-x1; p3=△y,q3=y1-ywmin;p4=△y,q4=ywmax-y1。 pk=0,线段平行于裁剪边界之一; 如果满足qk<0,线段完全在边界外; 如果满足qk≥0,线段平行于裁剪边界,且在窗口内。 pk<0, 线段从裁剪边界延长线的外部延伸到内部; pk>0,线段从裁剪边界延长线的内部延伸到外部。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ◘ 一维裁剪思想 ◘ 诱导窗口生成 ◘ 诱导窗口计算 ◘ 算法计算思想 ◘ 算法计算实现 ◘ 算法计算过程 ◘ 算法功用分析 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 梁-Barsky 裁剪:算法思想
当pk非零时,可计算出线段与边界k或延长线交点的u值:当pk非零时,可计算出线段与边界k或延长线交点的u值: u=qk/pk; 对于每条直线,可计算出参数u1和u2,它们定义了在裁剪矩形内的线段部分: u1>u2,则线段完全落在裁剪窗口之外,被舍弃。 u1≤u2,被裁剪线段端点由参数u的两个值计算出来。 u1的值由线段从外到内遇到的矩形边界所决定(p<0), 对这些边界计算:rk=qk/pk, u1取0和各个rk值之中的最大值; u2的值由线段从内到外遇到的矩形边界所决定(p>0), rk由这些边界计算出来:rk=qk/pk, u2取1和各个rk值之中的最小值。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ◘ 一维裁剪思想 ◘ 诱导窗口生成 ◘ 诱导窗口计算 ◘ 算法计算思想 ◘ 算法计算实现 ◘ 算法计算过程 ◘ 算法功用分析 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 梁-Barsky 裁剪:算法实现
线段交点的参数初始化为u1=0,u2=1。 定义一个函数,用p、q来判断是舍弃线段还是改变交点的参数r: 当p<0时,参数r用于更新u1; 当p>0时,参数r用于更新u2。 如果更新u1或u2后使u1>u2,则舍弃该线段。 否则,更新适当的u值仅仅是求出了交点、缩短线段。 p、q的四个值经过测试后,该线段未被舍弃,则裁剪线段的端点由u1、u2值决定。 当p=0,且q<0时,舍弃该线段, 因为平行于边界并且位于边界之外。 反复执行上述过程,计算出各个裁剪边界的p,q值,进行判断。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ◘ 一维裁剪思想 ◘ 诱导窗口生成 ◘ 诱导窗口计算 ◘ 算法计算思想 ◘ 算法计算实现 ◘ 算法计算过程 ◘ 算法功用分析 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 梁-Barsky 裁剪:算法过程
通常,梁友栋-Barsky算法比Cohen-Sutherland算法更有效,因为需要计算的交点数目减少了;通常,梁友栋-Barsky算法比Cohen-Sutherland算法更有效,因为需要计算的交点数目减少了; 更新参数u1、u2仅仅需要一次除法;线段与窗口的交点仅计算一次就计算出u1、u2的最后值。 相比之下,即使一条线段完全落在裁剪窗口之外,Cohen-Sutherland算法也要对它反复求交点,而且每次求交计算都需要除和乘。 梁友栋-Barsky和Cohen-Sutherland算法都可以扩展为三维裁剪算法。 A1 T Window R Q2 L A2 P2 B 1001 1000 1010 Q1 P1 0000 0001 0010 窗口 0101 0100 0110 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ◘ 一维裁剪思想 ◘ 诱导窗口生成 ◘ 诱导窗口计算 ◘ 算法计算思想 ◘ 算法计算实现 ◘ 算法计算过程 ◘ 算法功用分析 ● NLN直线裁剪 ● 非矩形窗口裁剪 ☆多边形裁剪 梁-Barsky 裁剪:算法分析
Nicholl-Lee-Nicholl(即NLN)算法通过在裁剪窗口周围创立多个区域来避免对一个直线段多次裁剪。Nicholl-Lee-Nicholl(即NLN)算法通过在裁剪窗口周围创立多个区域来避免对一个直线段多次裁剪。 Nicholl-Lee-Nicholl算法在求交计算前进行更多的区域测试来减少求交计算。 与粱友栋-Barsky和Cohen-Sutherland算法相比,Nicholl-Lee-Nicholl算法的比较和除法次数减少。 Nicholl-Lee-Nicholl算法仅仅用于二维直线裁剪, 粱友栋-Barsky和Cohen-Sutherland算法可以很方便地扩展为三维裁剪算法。 对于端点为P1P2的线段,NLN算法主要包括三个步骤: ⑴.决定P1相对于裁剪矩形区域的位置; ⑵.确定P2相对于裁剪矩形区域的位置; ⑶.求交点,确定P1P2可见部分。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ◘ NLN区域划分 ◘ NLN区域0 ◘ NLN区域1 ◘ NLN区域4 ◘ 确定端点区域 ◘ 确定可见部分 ● 非矩形窗口裁剪 ☆多边形裁剪 线段裁剪:Nicholl-Lee-Nicholl算法
端点P1相对于裁剪矩形区域的位置测试。 裁剪窗口四个边界将二维平面划分成九个区域。 从P1点向窗口的四个角点发出四条射线, 它们和窗口四条边界一起将二维平面划分为更多的小区域。 此时,P2位置(属于哪个区域)决定P1 P2和窗口边界的相交关系。 2 4 3 PLT PTR 0 1 P1 5 PRB 6 7 8 PBL ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ◘ NLN区域划分 ◘ NLN区域0 ◘ NLN区域1 ◘ NLN区域4 ◘ 确定端点区域 ◘ 确定可见部分 ● 非矩形窗口裁剪 ☆多边形裁剪 NLN裁剪算法:区域划分 • 不失一般性,只考虑P1在区域0、4、5三个区域的情况。 • 如果P1位于其它六个区域中,可通过二维变换使之落于这三个区域内。
当P1落在区域0时 平面被划分成4个有意义的区域L,T,R,B。 若P2属于区域L,P1P2只与窗口的左边相交; 以此类推。 T P1 R L B P1落在区域0 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ◘ NLN区域划分 ◘ NLN区域0 ◘ NLN区域1 ◘ NLN区域4 ◘ 确定端点区域 ◘ 确定可见部分 ● 非矩形窗口裁剪 ☆多边形裁剪 NLN 裁剪算法:区域0
LT L LR P1 LB P1落在区域5 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ◘ NLN区域划分 ◘ NLN区域0 ◘ NLN区域1 ◘ NLN区域4 ◘ 确定端点区域 ◘ 确定可见部分 ● 非矩形窗口裁剪 ☆多边形裁剪 NLN 裁剪算法:区域1 • 当P1落在区域5时 • 平面被划分成4个区域L,LT,LR,LB, • 若P2属于区域LT,P1P2只与窗口左边、上边相交;以此类推; • 若P2不属于区域L,LT,LR,LB,则P1P2完全不可见。
当P1落在区域4时:又分为两种情况: 若P1落于窗口对角线下部时,平面被划分成5个区域:L,T,TR,LR,LB; 若P1落于窗口对角线上部时,平面被划分成5个区域: L,T,TR,TB,LB。 P1 对角线 P1 对角线 T T TR L L TR LR LB TB LB P1落在区域4(对角线下方) P1落在区域4(对角线上方) ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ◘ NLN区域划分 ◘ NLN区域0 ◘ NLN区域1 ◘ NLN区域4 ◘ 确定端点区域 ◘ 确定可见部分 ● 非矩形窗口裁剪 ☆多边形裁剪 NLN 裁剪算法:区域4
⑵.确定P2所在区域 根据窗口四条边界的坐标值以及P1P2和各射线的斜率可确定P2所在区域。 例如,在区域5中,即P1在裁剪边界的左边,满足下列条件,则P2在区域LT中: ymax≤y2 ; Slope(P1PTR)<Slope(P1P2)<Slope(P1PTL) 或:(yT-y1)/(xR-x1)<(y2-y1)/(x2-x1)<(yT-y1)/(xL-x1) 如果满足下列条件则舍弃整个直线: (yT-y1)(x2-x1)<(xL-x1)(y2-y1) ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ◘ NLN区域划分 ◘ NLN区域0 ◘ NLN区域1 ◘ NLN区域4 ◘ 确定端点区域 ◘ 确定可见部分 ● 非矩形窗口裁剪 ☆多边形裁剪 NLN裁剪算法:确定端点区域
⑶.求交点,确定P1P2可见部分 斜率测试中的坐标差值和计算结果用于求交计算。 由参数方程式: x=x1+(x2-x1)u; y=y1+(y2-y1)u 与窗口左边界的x交点位置是: x=xL, u=(xL-x1)/(x2-x1), 所以,y交点的位置是: y=y1+[(y2-y1)/(x2-x1)](xL-x1) 并且与窗口顶部边界的交点是: y=yT, u=(yT-y1)/(y2-y1), 所以,x交点的位置是: x=x1+[(x2-x1)/(y2-y1)](yT-y1) ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ◘ NLN区域划分 ◘ NLN区域0 ◘ NLN区域1 ◘ NLN区域4 ◘ 确定端点区域 ◘ 确定可见部分 ● 非矩形窗口裁剪 ☆多边形裁剪 NLN裁剪算法:确定可见部分
在某些应用中,需要用任意形状的多边形对线段裁剪。在某些应用中,需要用任意形状的多边形对线段裁剪。 参数化线段的算法(如:粱友栋-Barsky算法)都可以扩充到凸多边形窗口。 只需修改算法使参数化方程适合裁剪区域的边界,按照裁剪多边形的坐标范围处理线段。 圆或其它曲线边界也可实现裁剪算法,但用的很少。 用这些区域裁剪算法速度更慢,因为它的求交计算涉及非线性曲线方程。 线段首先被曲线裁剪区域的外接矩形裁剪,完全落在外接矩形之外的线段被舍弃。 再通过计算圆心到直线端点的距离来识别出内部线段。 凹多边形可以在分解为一组凸多边形后再使用参数化裁剪方法。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ◘ 凹多边形定义 ◘ 向量法分解 ◘ 向量法实例 ◘ 旋转法分解 ☆多边形裁剪 线段裁剪:非矩形裁剪窗口线段裁剪
绕多边形边界计算相邻边界向量的叉乘结果可识别出凹多边形。绕多边形边界计算相邻边界向量的叉乘结果可识别出凹多边形。 如果一些叉乘结果的z分量为正,而另一些z分量为负,则该多边形为凹多边形。 否则,该多边形为凸多边形。 必须假定没有三个相邻的点是共线的, 因为三点共线的情况下,这两个相邻的边向量的叉乘结果为零。 如果所有的点是共线的,则得到了退化的多边形(一条直线)。 V6 V5 Y E5 E4 V4 E6 E3 V3 E2 E1 V1 V2 (E1×E 2)z>0 X (E2×E 3)z>0 (E3×E 4)z<0 (E4×E 5)z>0 (E5×E 6)z>0 (E6×E 1)z>0 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ◘ 凹多边形定义 ◘ 向量法分解 ◘ 向量法实例 ◘ 旋转法分解 ☆多边形裁剪 凹多边形的定义
在xy平面上分解凹多边形的向量法: 按照逆时针的方向计算边矢量的叉乘结果,并且记录叉乘结果z分量的符号。 如果z分量变为负值(如图所示),则多边形为凹多边形。 可以沿叉乘矢量对中第一条边的延长线将多边形分解开。 V6 V5 Y E5 E4 V4 E6 E3 V3 E2 E1 V1 V2 (E1×E 2)z>0 X (E2×E 3)z>0 (E3×E 4)z<0 (E4×E 5)z>0 (E5×E 6)z>0 (E6×E 1)z>0 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ◘ 凹多边形定义 ◘ 向量法分解 ◘ 向量法实例 ◘ 旋转法分解 ☆多边形裁剪 分解凹多边形:向量法
图为xy平面内六条边的凹多边形。该多边形边向量为:图为xy平面内六条边的凹多边形。该多边形边向量为: E1=(1,0,0),E2=(1,1,0),E3=(1,1,0), E4=(0,2,0),E5=(3,0,0),E6=(0,2,0)。 Ei×Ej叉乘结果的z分量为:EixEiy-EjxEiy: E1×E2=(0,0,1),E2×E3=(0,0,-2),E3×E4=(0,0,2), E4×E5=(0,0,6),E5×E6=(0,0,6),E6×E1=(0,0,2)。 Y 3 E5 2 E4 E6 1 E3 E2 E1 0 3 1 2 X 用向量法分割凹多边形 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ◘ 凹多边形定义 ◘ 向量法分解 ◘ 向量法实例 ◘ 旋转法分解 ☆多边形裁剪 向量法分解计算实例 • E2×E3叉乘向量有负z分量→ • 沿E2矢量延长线划分多边形。 • 然后,确定该直线与另一多边形边的交点,这样一个多边形分为两个。 • 这两个多边形没有叉乘的结果为负,它们都为凸多边形。
绕多边形逆时针前进,将多边形顶点Vk平移到坐标原点。绕多边形逆时针前进,将多边形顶点Vk平移到坐标原点。 然后顺时针旋转,使下一点Vk+1在x轴上。 如果下一点Vk+2在x轴下, 则多边形为凹多边形,沿x轴将多边形分割为两个新多边形。 继续对这两个新的多边形重复进行凹多边形测试。 否则,继续旋转x轴上的顶点,测试顶点的y值是否为负。 Y V1 V2 V3 X V4 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ● 线段参数裁剪 ● 线段编码裁剪 ● 梁-Barsky裁剪 ● NLN直线裁剪 ● 非矩形窗口裁剪 ◘ 凹多边形定义 ◘ 向量法分解 ◘ 向量法实例 ◘ 旋转法分解 ☆多边形裁剪 分解凹多边形:旋转法 用旋转法分割凹多边形(在旋转V3到x轴时,V4在x轴下,所以,沿V3V4划分多边形)
多边形是由线段构成的→→ 多边形裁剪依然是采用线段裁剪。 但必须考虑多边形的定义,即:线段间的关系。 线段裁剪结果 正确裁剪结果 线段裁剪结果 正确裁剪结果 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ◘ 裁剪特点 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法 多边形裁剪
在图形学中,多边形定义一个封闭的二维区域,裁剪结果也应该是一个封闭多边形区域。在图形学中,多边形定义一个封闭的二维区域,裁剪结果也应该是一个封闭多边形区域。 多边形裁剪有其特殊性,这种特殊性表现在: 用线段裁剪处理的凸多边形边界显示为一系列不连接的直线段。 即:多边形的边被裁剪后一般不再封闭,需要用窗口边界的适当部分来封闭它。 如何确定这部分边界? 一个凹多边形有可能被裁剪成为几个小的多边形, 如何确定这些小多边形的边界? 本节介绍两种常用的多边形裁剪算法: Sutherland-Hodgman算法 Weilerr-Atherton算法。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ◘ 裁剪特点 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法 多边形裁剪的特点
逐边裁剪法 将多边形边界作为一个整体; 多边形裁剪分解为:关于裁剪窗口每条边界的裁剪。 裁剪过程: 对多边形顶点集进行初始化; 用矩形左边界裁剪多边形,产生新的顶点序列; 这个新顶点集依次传给右边界、下边界和上边界处理; 依次对右边界、下边界和上边界进行处理,在每一步产生的新的顶点序列传给下一个窗口边界去裁剪。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ◘ 顶点处理思想 ◘ 顶点处理示例 ◘ 顶点处理规则 ◘ 逐边流水处理 ◘ 算法存在问题 ◘ 算法特殊处理 ● 对象裁剪方法 ● 其它裁剪方法 多边形裁剪:Sutherland-Hodgman算法
Sutherland-Hodgman算法将二维空间中的凸多边形区域看成是它的边所在直线形成的半空间的交。Sutherland-Hodgman算法将二维空间中的凸多边形区域看成是它的边所在直线形成的半空间的交。 在进行多边形裁剪时,窗口各边所在直线将二维空间划分成两个半空间。 裁剪窗口所在的一侧为内侧空间; 另一侧为外侧空间。 根据多边形每一边与窗口边所形成的半空间关系,输出0个、1个或2个顶点到结果多边形顶点表中。 Sutherland-Hodgman算法就很容易推广到任意凸多边形裁剪和三维裁剪中任意凸多面体裁剪窗口的情况。 任意凸多边形或多面体可分解为多个半空间。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ◘ 顶点处理思想 ◘ 顶点处理示例 ◘ 顶点处理规则 ◘ 逐边流水处理 ◘ 算法存在问题 ◘ 算法特殊处理 ● 对象裁剪方法 ● 其它裁剪方法 Sutherland-Hodgman算法的顶点处理 新的顶点系列是如何组成的?
右图示出了用窗口左边界如何根据区域的内外侧空间确定输出顶点。右图示出了用窗口左边界如何根据区域的内外侧空间确定输出顶点。 顶点1和顶点2在边界的外边;(不保留顶点) 顶点3在窗口内,故计算出顶点2到顶点3的直线与窗口边界的交点,并且保存交点和顶点3; (保留两个顶点) 顶点4和顶点5判定在窗口内,两个顶点都要保存。 (保留两个顶点) 顶点6点和最后一顶点位于窗口的外部,所以要计算顶点5至顶点6的直线与左边界的交点,并保存。(保留一个顶点) 3 2 2’ 1’ 1 3’ 4 5’ 6 4’ 5 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ◘ 顶点处理思想 ◘ 顶点处理示例 ◘ 顶点处理规则 ◘ 逐边流水处理 ◘ 算法存在问题 ◘ 算法特殊处理 ● 对象裁剪方法 ● 其它裁剪方法 Sutherland-Hodgman算法顶点处理示例 五个保存点1’、2’、3’、4’、5’构成裁剪窗口左边界裁剪结果多边形,这五个保存的点用窗口的下一边界重复处理。
当相邻的一对多边形顶点被传到裁剪程序时需进行四种关系检测:当相邻的一对多边形顶点被传到裁剪程序时需进行四种关系检测: 第一点在窗口边界外侧,第二点在窗口边界内侧,则该边与窗口边界的交点和第二点都被加到输出顶点表中。 两顶点都在窗口边界内侧,则只有第二点加入输出顶点表中。 第一点在窗口边界内侧,第二点在外侧,则只有与窗口边界的交点加到输出顶点表中。 两个点都在窗口边界外侧,输出顶点表中不增加任何点。 裁剪结果多边形的顶点由两部分组成: 落在裁剪边内侧的原多边形顶点; 多边形的边与裁剪边的交点。 只要将这两部分顶点按一定顺序连接起来,就得到裁剪结果多边形。 V1’ V2 V1 外→内 保存V1’,V2 V1 内→内 保存V2 V2 内→外 保存V1’ V1 V1‘ V2 V2 外→外 不保存 V1 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ◘ 顶点处理思想 ◘ 顶点处理示例 ◘ 顶点处理规则 ◘ 逐边流水处理 ◘ 算法存在问题 ◘ 算法特殊处理 ● 对象裁剪方法 ● 其它裁剪方法 Sutherland-Hodgman算法顶点处理规则
如果上述算法实现中每一步仅裁剪点,并将裁剪后的顶点传到下一边界的裁剪程序,可减少中间输出顶点表。如果上述算法实现中每一步仅裁剪点,并将裁剪后的顶点传到下一边界的裁剪程序,可减少中间输出顶点表。 这样就可用并行处理器或者单处理器的裁剪算法的流水线完成。 只有当一个点(输入点或交点)被窗口的四个边界都判定在窗口内或窗口边界上时,才加入到输出顶点表。否则该点不再由流水线处理。 V3 V2’ V2” V3’ V2 V1’ V1 左裁 剪器 底裁 剪器 顶裁 剪器 右裁 剪器 内空间 内空间 外空间 有交点 内空间 V1 V2”,V2’ V2”,V2’ V1 V1 内空间 内空间 内空间 内空间 V2 V3 V1’ V3 V1’ 内空间 内空间 V3 V3’ V3’ (V2’,V3) (V2’,V3) 内空间 内空间 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ◘ 顶点处理思想 ◘ 顶点处理示例 ◘ 顶点处理规则 ◘ 逐边流水处理 ◘ 算法存在问题 ◘ 算法特殊处理 ● 对象裁剪方法 ● 其它裁剪方法 Sutherland-Hodgman算法流水实现 将多边形顶点及多边形与裁剪窗口的交点求出,分别进行裁剪。 输入 输出 V2”在左边界上、右边界内; V3’在左边界和右边界内。 输出顶点:V2”、V2” 、V3 、V3’
利用Sutherland-Hodgeman算法对凸多边形进行裁剪可以获得正确的裁剪结果。利用Sutherland-Hodgeman算法对凸多边形进行裁剪可以获得正确的裁剪结果。 对如右图的凹多边形裁剪将可能出现多余的线。 由于该算法裁剪所得的结果应是、也只能是一个多边形,即: 只有一个输出顶点表,表中最后一个顶点总是连着第一个顶点。 这种情况在裁剪后的多边形有两个或者多个分离部分时会出现。 裁剪 多余线段 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ◘ 顶点处理思想 ◘ 顶点处理示例 ◘ 顶点处理规则 ◘ 逐边流水处理 ◘ 算法存在问题 ◘ 算法特殊处理 ● 对象裁剪方法 ● 其它裁剪方法 Sutherland-Hodgman算法存在问题
裁剪 多余线段 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ◘ 顶点处理思想 ◘ 顶点处理示例 ◘ 顶点处理规则 ◘ 逐边流水处理 ◘ 算法存在问题 ◘ 算法特殊处理 ● 对象裁剪方法 ● 其它裁剪方法 Sutherland-Hodgman算法特殊处理 • 为正确裁剪凹多边形: • 一种方法是: • 将凹多边形分割成两个或者更多的凸多边形,然后分别处理各个凸多边形。 • 另一种方法是: • 修改Sutherland-Hodgeman算法,沿着任何一个裁剪窗口边界检查顶点表,正确地连接顶点对。 • 还有一种方法是: • 用更常用多边形裁剪方法,如下节所述的Weiler-Atherton算法或Weiler算法。
Weilerr-Atherton算法的基本思想是: 根据多边形处理方向(顺时针/逆时针)和当前处理的多边形顶点对是由外到内,还是由内到外来确定裁剪后多边形的顶点连接方式: 沿着多边形边界方向连接; 还是沿着窗口边界方向连接。 如果顺时针处理顶点,则采用下列规则: 对由外到内的顶点对(交点为进点),沿着多边形边界的方向连接。 对由内到外的顶点对(交点为出点) ,按顺时针沿着窗口边界的方向连接。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ◘ 算法示例 ◘ 算法实现步骤 ◘ 算法特殊处理 ● 其它裁剪方法 多边形裁剪: Weilerr-Atherton算法
V2 V2 V1’ V1’ V1 V3 V3 裁剪 V3’ V3’ (恢复) V4 V4’ V4’ V5’ V5 V5 V6 V5’ (恢复) ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ◘ 算法示例 ◘ 算法实现步骤 ◘ 算法特殊处理 ● 其它裁剪方法 多边形裁剪: Weilerr-Atherton算法示意
建立多边形和裁剪窗口的顶点表; 求出多边形与窗口的交点,并将这些交点按顺序插入两多边形的顶点表中。 在两多边形顶点表中的相同交点间建立双向指针。 建立空的裁剪结果多边形的顶点表。 选取任一没有被跟踪过的交点为起点,将其输出到结果多边形顶点表中: 如果该交点为进点,跟踪多边形边界; 否则,跟踪窗口边界(顶点表)。 跟踪多边形边界,每遇到多边形顶点,将其输出到结果多边形顶点表中,直至遇到新的交点。 将该交点输出到结果多边形顶点表中,并通过连接该交点的双向指针改变跟踪方向 如果上一步跟踪的是多边形边界,改为跟踪窗口边界;反之,改为跟踪窗口边界)。 重复前两步,直到回到起点。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ◘ 算法示例 ◘ 算法实现步骤 ◘ 算法特殊处理 ● 其它裁剪方法 Weilerr-Atherton算法:实现步骤
为使Weilerr-Atherton算法正确运行,交点的奇异情况需要处理。当多边形顶点和边与窗口边界重合时,交点计算须视情况而定,处理方法如下:为使Weilerr-Atherton算法正确运行,交点的奇异情况需要处理。当多边形顶点和边与窗口边界重合时,交点计算须视情况而定,处理方法如下: 与裁剪窗口边界重合的多边形的边不参与求交点。 对于顶点落在裁剪窗口边界上的多边形边: 如果它落在该裁剪边的内侧,将该顶点算作交点; 否则,不将该顶点算作交点。 Weiler-Atherton算法进一步发展为Weiler算法。 用于任意多边形裁剪区域来裁剪多边形。 对于下图中的多边形而言,正确裁剪后的多边形为裁剪多边形和被裁剪多边形的交集。 多边形对象 裁剪窗口多边形 裁下区域 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ◘ 算法示例 ◘ 算法实现步骤 ◘ 算法特殊处理 ● 其它裁剪方法 Weilerr-Atherton算法:特殊处理
各种参数化线段裁剪算法也适合于多边形裁剪,尤其适合于凸多边形裁剪窗口的情况。各种参数化线段裁剪算法也适合于多边形裁剪,尤其适合于凸多边形裁剪窗口的情况。 粱友栋-Barskey直线裁剪算法可以扩展为更一般的多边形裁剪算法,这类似于Sutherland-Hodgeman方法。参数化的线段方法采用与线段裁剪中使用的相类似的区域测试过程绕多边形处理多边形的边界。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法 ◘ 曲线边界裁剪 ◘ 文字的裁剪 ◘ 外部裁剪 ◘ 凹多边形裁剪 多边形裁剪:其它多边形裁剪
对曲线边界区域可以用前面类似的方法来裁剪。对曲线边界区域可以用前面类似的方法来裁剪。 曲线边界区域裁剪过程涉及非线性方程,与线性边界区域处理相比需要更多的处理。 圆或其它曲线边界对象的外接矩形可用来首先测试是否与矩形裁剪窗口有重叠: 对象外接矩形完全落在裁剪窗口内,则保存该对象; 对象的外接矩形完全落在裁剪窗口外,则舍弃该对象。 如果不满足上述矩形测试的条件,则要寻找计算存储的方法。 该方法同样可用于一般多边形裁剪窗口对曲线边界对象的裁剪: 第一步用裁剪区域的外接矩形对对象的外接矩形进行裁剪; 如果两个区域有重叠,则要解直线-曲线联立方程组,得出裁剪交点。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法 ◘ 曲线边界裁剪 ◘ 文字的裁剪 ◘ 外部裁剪 ◘ 凹多边形裁剪 曲线边界区域的裁剪
在图形软件包中有几种对文字裁剪的技术。根据产生文字的方法和具体应用的要求采用不同的技术。在图形软件包中有几种对文字裁剪的技术。根据产生文字的方法和具体应用的要求采用不同的技术。 用窗口边界处理字符串最简单的方法是全部保留或全部舍弃字符串的裁剪策略。该方法裁剪文字速度最快。 裁剪与窗口边界有重叠的字符串处理方法是取舍整个字符,即全部保留或全部舍弃一个字符的裁剪策略。 还一种处理方法是对各个字符本身裁剪,用线段裁剪的方法对字符进行裁剪。如果一个字符与裁剪窗口边界有重叠,则裁剪掉落在窗口之外的字符部分。 由线段构成的轮廓字体可以用线段裁剪算法来处理。 用位图定义的字符,通过比较字符网格中各个象素对裁剪边界的相对位置来裁剪。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法 ◘ 曲线边界裁剪 ◘ 文字的裁剪 ◘ 外部裁剪 ◘ 凹多边形裁剪 文字的裁剪
前面的裁剪是:舍弃裁剪区外的图形部分、保留裁剪区内的图形部分。前面的裁剪是:舍弃裁剪区外的图形部分、保留裁剪区内的图形部分。 在某些情况下,要保留落在裁剪区域外的图形部分,即外部裁剪。 外部裁剪应用的典型例子是多窗口系统: 既需要内部裁剪,又需要外部裁剪。 窗口内部的对象用内部裁剪。 如果有优先级更高的窗口覆盖在这些对象上,则对象用覆盖窗口进行外部裁剪。 外部裁剪也常用于有覆盖图形的情况: 通过外部裁剪为将它们插入到一幅较大的图中提供空间。例如: 在广告或出版应用中的页面布局设计或者为图形加上标签和设计图模。 外部裁剪技术还可以将图形、图象简图合成起来。 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法 ◘ 曲线边界裁剪 ◘ 文字的裁剪 ◘ 外部裁剪 ◘ 凹多边形裁剪 外部裁剪
用凹多边形窗口的内部裁剪对象也可以利用外部裁剪。用凹多边形窗口的内部裁剪对象也可以利用外部裁剪。 例:用凹多边形窗口V1V2V3V4V5的内部来裁剪线段P1P2。 V2 V2 V1 V1 P2 V5 P1 V5 V3 V3 V4 V4 V2 V1 P1’ P2’ P2 P1 V3 V4 V1 P1” P2’ P1’ V5 V4 ☆二维裁剪定义 ☆点的裁剪 ☆线段裁剪 ☆多边形裁剪 ● 逐边裁剪方法 ● 对象裁剪方法 ● 其它裁剪方法 ◘ 曲线边界裁剪 ◘ 文字的裁剪 ◘ 外部裁剪 ◘ 凹多边形裁剪 外部裁剪:凹多边形裁剪 裁剪线段P1P2可以分为两步: • 用凸多边形V1V5V4外部裁剪P1’P2’,得到线段P1”P2’。 • 用凸多边形V1V2V3V4的内部裁剪P1P2,得到裁剪后的线段P1’P2’;