图形的裁剪

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(2)线段两端点都在同一边界线的外侧 线段应舍去 )线段两端点都在同一边界线的外侧,线段应舍去
L(1)* L(2) +R(1) * R(2) +B(1) * B(2) +T(1) * T(2) ≠ 0
(3)求交运算:其代码的哪位为 ,其与哪条边相交。 )求交运算:其代码的哪位为1,其与哪条边相交。
线段裁剪中交点坐标的计算: 线段裁剪中交点坐标的计算: 如果边界线段是垂直的: 如果边界线段是垂直的: Xi=Xmin or Xmax = Yi=y1+m(Xi-x1) = + 如果边界线段是水平的: 如果边界线段是水平的: Xi=x1+ (Yi-y1)/ m = + Yi =Ymin or Ymax
(1)线段完全可见 ) (2)显然不可见 ) (3)线段至少有一端点在窗口之外,但非显然不可见 )线段至少有一端点在窗口之外,
为提高效率,算法设计应考虑: 为提高效率,算法设计应考虑: 1.快速判断情形(1)(2) 1.快速判断情形(1)(2) 快速判断情形 2.设法减少情形(3)求交次数和每 2.设法减少情形(3)求交次数和每 设法减少情形(3) 次求交时所需的计算量
图 形 裁 剪
视图区
简称视图(viewport),是在屏 简称视图(viewport),是在屏 视图 ), 幕上定义的一个小于或等于屏幕区 域的一个矩形块。 域的一个矩形块。视图区可用来显 示某一窗口内的图形。 示某一窗口内的图形。
窗口区
进行图形设计时,图形输出程序中的图形 都是在用户坐标系中定义的,此坐标系拥 有的区域在理论上是无限的,在使用时我 们可以把它当作一个有限的矩形区,这就 是用户域。用户可以在用户域中指定任意 区域输出到屏幕上,这个指定区域称为窗 口区,简称窗口(window)。 定义窗口的目的是选取用户所定义的图形 中需要观察的那一部分图形。
GH裁剪: 裁剪: 裁剪 可以先从G或 开始 开始, 可以先从 或H开始, 因为他们都在窗口外 G:0100为了使得 变 : 为了使得1变 为了使得 为0,得到交点 (11/5, ,得到交点I4( , 1) ) 得不显示GI4, 保留 , 得不显示 I4H(为分类2),因为 (为分类 ), ),因为 (0010)and(0010) ) ( ) 不为0, =0010 不为 , 所以不可见
1.矩形裁剪窗口:[xmin,xmax] X [ymin,ymax] 矩形裁剪窗口: 矩形裁剪窗口 2.待裁剪线段:P0 ( x0 , y 0 ) P1 ( x1 , y1 ) 待裁剪线段: 待裁剪线段
线段裁剪
:
点裁剪
在窗口内的充分必要条件是: 点(x, y)在窗口内的充分必要条件是: 在窗口内的充分必要条件是 x min ≤ x ≤ x max y min ≤ y ≤ y max 问题:对于任何多边形窗口,如何判别? 问题:对于任何多边形窗口,如何判别?
Cohen-Sutherland裁剪
• 是最早、最流行的线段裁剪算法,也称编码算 法。它通过编码测试来减少要计算的交点数目。 • 基本思想:对每条直线段p1(x1,y1)p2(x2,y2)分 三种情况处理: ◎ 直线段完全可见,取之。 ◎直线段完全不可见,弃之。 ◎直线段不满足以上两种条件,需要对直线段 按交点进行分段,分段后重复上述处理。
AB裁剪: 裁剪: 裁剪 A的区域编码为 的区域编码为0001 的区域编码为 为了使得1变为 为了使得 变为0 变为 得出的交点: 得出的交点: I1(-3,11/3),得不显 ( , ),得不显 ), 保留I1B(仍然为 示AI1 保留 ( 分类3),因为( 分类 ),因为(0000) ),因为 ) and(1000)= ( )=0000 )=
给图中的线段分类 分类1(可见): 分类 (可见): EF两个端点的区域 两个端点的区域 码都是0000 码都是 分类2(不可见) 分类 (不可见) IJ因为(1001)and 因为( 因为 ) )=1000, (1000)= )= , 不等于0 不等于
分类3(需裁剪的线段): ):AB、 、 分类 (需裁剪的线段): 、CD、GH 因为AB (0001)and(1000)=0000 ) ( ) 因为 CD (0000)and(1010)=0000 ) ( ) GH (0100)and(0010)=0000 ) ( )
Cohen-Sutherland裁剪
线段裁剪算法: 线段裁剪算法: Cohen-Sutherland 算法编码
(1)线段的两端点均在窗口内,线段属于完全可见,应保留。 )线段的两端点均在窗口内,线段属于完全可见,应保留。
L(1)+R(1)+B(1)+T(1)=0 L(2)+R(2)+B(2)+T(2)=0
窗口区和视图区
通过窗口-视图变换,我们就实现了将用户 坐标系中窗口区中任意一点转换成设备坐 标系中屏幕视图区中一点的变换,从而就 可以把实际物体以图形的方式显示在显示 器上。但要注意,为了使经过窗口-视图变 换后的图形在视图区中输出时不产生失真, 在定义窗口和视图时,必须保证窗口区和 视图区高度和宽度之间的比例相同。
方法
最简单的裁剪方法是把各种图形扫描转换为点之 再判断各点是否在窗内。但那样太费时, 后,再判断各点是否在窗内。但那样太费时,一 般不可取。 般不可取。这是因为有些图形组成部分全部在窗 口外,可以完全排除,不必进行扫描转换。 口外,可以完全排除,不必进行扫描转换。所以 先裁剪再扫描转换的方法 一般采用先裁剪再扫描转换的方法。 一般采用先裁剪再扫描转换的方法。
此时B在窗口外,为使1变为 ,得出交点I2(-8/5,6), 此时 在窗口外,为使 变为0,得出交点 ( , ), 在窗口外 变为 I2B被裁剪,剩下 被裁剪, 被显示。 被裁剪 剩下I1I2被显示。因为他们的区域编码都是 被显示 因为他们的区域编码都是0000
CD裁剪:先从D开始 裁剪:先从 开始 裁剪 编码为1010,为使第一 , 编码为 变为0 个1变为 变为 得出的交点: 得出的交点: I3(1/3,6)区域编码 ( , ) 为0000,得不显示 ,得不显示I3D 保留CI3(仍然为分类 ( 保留 3),因为(0000)and ),因为( ),因为 ) )=0000 (1000)= )=
窗口区和视图区
通常我们利用窗口来选择需要观察的那一 部分图形,而利用视图区来指定这一部分 图形在屏幕上的显示位置。 由于窗口和视图是在不同坐标系中定义的, 因此,在把窗口中图形信息送到视图区之 前,必须进行坐标变换,即把用户坐标系 的坐标值转换为设备(屏幕)坐标系的坐 标值,这个变换称窗口-视图变换。
Байду номын сангаас
线段裁剪算法: 线段裁剪算法: Cohen-Sutherland 算法步骤
判别线段两端点是否都落在窗口内,如果是, 第一步 判别线段两端点是否都落在窗口内,如果是,则线段 完全可见;否则进入第二步; 完全可见;否则进入第二步; 判别线段是否为显然不可见 如果是,则裁剪结束; 显然不可见, 第二步 判别线段是否为显然不可见,如果是,则裁剪结束; 否则进行第三步; 否则进行第三步; 求线段与窗口边延长线的交点, 窗口边延长线的交点 第三步 求线段与窗口边延长线的交点,这个交点将 线段分为 两段, 显然不可见,丢弃。 两段,其中一段 显然不可见,丢弃。对余下的另一段重 新进行第一步,第二步判断,直至结束。 新进行第一步,第二步判断,直至结束。
偶规则(Odd-even Rule) 奇-偶规则
从任意位置p作一条射线,若与该射线相交的多边形边的数目 为奇数,则p是多边形内部点,否则是外部点。
非零环绕数规则(Nonzero Winding Number Rule) 非零环绕数规则
1.首先使多边形的边变为矢量。 2.将环绕数初始化为零。 3.再从任意位置p作一条射线。当从p点沿射线方向移动时,对在每个方向上穿 过射线的边计数,每当多边形的边从右到左穿过射线时,环绕数加1,从左到 右时,环绕数减1。 4.处理完多边形的所有边之后,若环绕数为非零,则p为内部点,否则,p是外 部点。
线段裁剪
: 待裁剪线段和窗口的关系
直线段完全被排斥在窗口之外 直线段完全被包含在窗口之内 直线段与窗口的一条边框相交,使得直线段被截断成两部分 直线段贯穿整个窗口,使得直线段被截断成三部分
直线段完全被排斥在窗口之外 直线段在窗口内有且仅有一个可见段
确定可见段的端点
线段裁剪
: 待裁剪线段和窗口的关系
窗口-视图变换
• 实质上是比例变换和平移变换的组合变换。 先进行平移变换,将窗口左下角坐标移到 用户坐标系原点,接着进行比例变换,使 窗口中各点比例变换到设备坐标系(屏幕) 中,最后再做平移变换,使原点移到视图 左下角。
裁剪的含义
裁剪的含义 为了能看到计算机内部存储数据量比较大的图形的各 为了能看到计算机内部存储数据量比较大的图形的各 看到计算机内部存储数据量比较大的 个局部细节。在放大显示一幅图形的一部分区域时, 个局部细节。在放大显示一幅图形的一部分区域时,必须 确定图形中哪些部分落在显示区之内,哪些落在显示区之 确定图形中哪些部分落在显示区之内,哪些落在显示区之 哪些部分落在显示区之内 外,以便显示落在显示区内的那部分图形。这个选择过程 以便显示落在显示区内的那部分图形。 落在显示区内的那部分图形 称为裁剪。 称为裁剪。 决定图形中哪些点、线段、文字、 裁剪的实质 决定图形中哪些点、线段、文字、以及多 边形在窗口之内。 边形在窗口之内。
结论:当线段的两个端点的编码的逻辑“与”非零时 ,线 结论: 段为显然不可见的 。
算法步骤: 算法步骤: 对直线段的两端点P1 P2按其所在区域编码得C1、 P1、 按其所在区域编码得C1 对直线段的两端点P1、P2按其所在区域编码得C1、C2 根据端点对直线进行可见和不可见的判断: 根据端点对直线进行可见和不可见的判断: C1=C2=0时 表示均在窗口内,应全部保留; ◎当C1=C2=0时,表示均在窗口内,应全部保留; C1&C2≠0时 表示均在窗口外,应全部舍弃; ◎当C1&C2≠0时,表示均在窗口外,应全部舍弃; 当直线段两端点不符合上述两种情况, ◎当直线段两端点不符合上述两种情况,则需计算出 直线段与窗口边线的交点,将直线段分段后返回上步。 直线段与窗口边线的交点,将直线段分段后返回上步。 逐段舍弃窗口外线段, 逐段舍弃窗口外线段,保留窗口内的线段
Cohen-Sutherland裁剪
上下右左” “上下右左”
线段裁剪算法: 线段裁剪算法: Cohen-Sutherland 算法编码
特点: 特点:对显然不可见线段的快速判别。 编码方法: 编码方法:由窗口四条边所在直线把二维平面分成9个区域,每 个区域赋予一个四位编码,Ct Cb Cr Cl(上下右左)。 端点编码: 端点编码:定义为它所在区域的编码。
Cohen-Sutherland裁剪
• 每条线段的端点都赋以四位二进制码,称为区域 码,用来标识出端点相对于裁剪矩形边界的位置。 • 区域码的各位指出线段端点与裁剪窗口四个相对 坐标位置的关系。 ◎裁剪窗口的四个相对坐标位置:左、右、上、 下; ◎区域码各位从右到左编号: ◎任何位赋值为1代表端点落在相应位置上;否则 1 该位置为0。 0
思考题:上下右左是编码顺序, 思考题:上下右左是编码顺序,设R是左下为 是左下为 L(-3,1),右上角为 (2,6)的矩形窗口。 ( , ),右上角为R( , )的矩形窗口。 ),右上角为
请写出图中线段端点的区域编码 给图中的线段分类 用cohen-sutherland算法裁剪这些线段 - 算法裁剪这些线段
1 Ct = 0 1 Cb = 0 1 Cr = 0 1 Cl = 0 当y > y max else 当y < y min else 当x > x max else 当x < x min else
线段裁剪算法: 线段裁剪算法: Cohen-Sutherland 算法编码
线段裁剪
判断图形元素是否落在裁剪窗口之 内并找出其位于内部的部分
裁剪的目的 线段裁剪处理的基础 假定条件 点裁剪 待裁剪线段和窗口的关系 线段裁剪算法
1. Cohen-Sutherland算法 算法 2. 中点分割算法 3. 参数化算法 4. Liang - Barsky算法 算法 1.图元关于窗口内外关系的判别 图元关于窗口内外关系的判别 2.图元与窗口的求交 图元与窗口的求交
相关文档
最新文档