计算机图形学裁剪算法详解

合集下载

计算机图形学实验报告材料三图形裁剪算法

计算机图形学实验报告材料三图形裁剪算法

实验题目:实验三图形裁剪算法1.实验目的:理解区域编码(Region Code,RC)设计Cohen-Sutherland直线裁剪算法编程实现Cohen-Sutherland直线裁剪算法2.实验描述:设置裁剪窗口坐标为:wxl=250;wxr=850;wyb=250;wyt=450;裁剪前如下图所示:裁剪后结果为:3.算法设计:Cohen-Sutherland 直线裁剪算法:假设裁剪窗口是标准矩形,由上(y=wyt)、下(y=wyb)、左(x=wxl)、右(x=wxr)四条边组成,如下图所示。

延长窗口四条边形成 9个区域。

根据被裁剪直线的任一端点 P(x,y)所处的窗口区域位置,可以赋予一组4位二进制区域码C4C3C2C1。

编码定义规则:第一位C1:若端点位于窗口之左侧,即 X<Wxl,则 C1=1,否则 C1=0。

第二位C2:若端点位于窗口之右侧,即 X>Wxr,则 C2=1,否则 C2=0。

第三位C3:若端点位于窗口之下侧,即 Y<Wyb,则 C3=1,否则 C3=0。

第四位C4:若端点位于窗口之上侧,即 Y>Wyt,则 C4=1,否则 C4=0。

裁剪步骤:1. 若直线的两个端点的区域编码都为0,即 RC1|RC2=0(二者按位相或的结果为0,即 RC1=0 且RC2=0),说明直线两端点都在窗口内,应“简取”。

2. 若直线的两个端点的区域编码都不为0,即 RC1&RC2≠0(二者按位相与的结果不为0,即 RC1≠0且 RC2≠0,即直线位于窗外的同一侧,说明直线的两个端点都在窗口外,应“简弃”。

3. 若直线既不满足“简取”也不满足“简弃”的条件,直线段必然与窗口相交,需要计算直线与窗口边界的交点。

交点将直线分为两段,其中一段完全位于窗口外,可“简弃”。

对另一段赋予交点处的区域编码,再次测试,再次求交,直至确定完全位于窗口内的直线段为止。

4. 实现时,一般按固定顺序左(x=wxl)、右(x=wxr)、下(y=wyb)、上(y=wyt)求解窗口与直线的交点。

计算机图形学裁剪技术

计算机图形学裁剪技术


求交测试顺序固定(左右下上) 最坏情形,线段求交四次。
裁剪
直线段裁剪
Cohen-Sutherland算法 中点分割算法 参数化裁剪算法 Liang-Barskey算法
多边形裁剪
Sutlerland_Hodgman算法
Weiler-Athenton算法
字符裁剪
裁剪

裁剪:确定图形中哪些部分落在显示区之内, 哪些落在显示区之外 , 以便只显示落在显示区 内的那部分图形。这个选择过程称为裁剪。在 进行裁剪时,画面中对应于屏幕显示的那部分 区域称为窗口。
Cohen-Sutherland算法

将区域码的各位从右到左编号,则坐标区 域与各位的关系为:
任何位赋值为1,代表端点落在相应的位置上,否则该 位为0。若端点在剪取矩形内,区域码为0000。如果端 点落在矩形的左下角,则区域码为0101。
直线段裁剪

裁剪线段与窗口的关系:(1)线段完全可见;(2) 显然不可见;(3)其它 提高裁剪效率: 快速判断情形(1)(2), 对于情形(3),设法减 少求交次数和每次求 交时所需的计算量。
常用的线段裁剪方法三种:

Cohen-Sutherland算法 中点分割算法 参数化裁剪算法
Cohen-Sutherland裁剪

基本思想:
对于每条线段P1P2分为三种情况处理: (1)若P1P2完全在窗口内,则显示该线段P1P2。 (2)若P1P2明显在窗口外,则丢弃该线段。
(3)若线段不满足(1)或(2)的条件,则在交点处把线段
分为两段。其中一段完全在窗口外,可弃之。然后对另一段 重复上述处理。

如何实现上述的处理呢?
实现方法:采用下面的编码方法

计算机图形学实验指导书--实验2使用线段剪裁

计算机图形学实验指导书--实验2使用线段剪裁

实验2使用线段剪裁Cohen——sutherland算法一.实验目的及要求根据Cohen——sutherland算法,掌握直线剪裁的程序设计方法。

注意,不能使用语言库中的画圆函数。

二.理论基础将不需要裁剪的直线挑出,并删去其中在窗外的直线,然后对其余直线,逐条与窗框求交点,并将窗框外的部分删去。

采用Cohen-Sutherland直线剪裁的算法一区域编码为基础,将窗口及周围的八个方向以4位的二进制数进行编码。

4个位分代表窗外上,下,左右的编码值。

三、算法分析1. Cohen—SutherLand直线裁剪算法裁剪的实质,就是决定图形中那些点、线段、文字、以及多边形在窗口之内。

Cohen—SutherLand直线裁剪算法的基本大意是:对于每条线段P1P2,分为三种情况处理。

1) 若P1P2完全在窗口内,则显示该线段P1P2,简称“取”之。

2) 若P1P2明显在窗口外,则丢弃该线段P1P2,简称“弃”之。

3) 若线段既不满足“取”的条件,也不满足“弃”的条件,则把线段分为两段。

其中一段完全在窗口外,可弃之。

然后对另一段重复上述处理。

为了使计算机能够快速地判断一条线段与窗口属何种关系,采用如下的编码方法。

延长窗口的边,把未经裁剪的图形区域分为9个区,每个区具有一个四位代码,即四位二进制数,从左到右各位依次表示上、下、左、右。

裁剪一条线段时,先求出端点P1P2所在的区号code1和code2。

若code1=0且code2=0,则说明P1和P2均在窗口内,那么整条线段也比在窗口内,应取之。

若code1和code2经按位与运算后的结果code1&code2不为0,则说明两个端点同在窗口的上方、下方、左方或右方。

若上述两种条件均不成立,则按第三种情况处理,求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段完全在窗口外,可以弃之。

再对另一段重复进行上述处理。

计算线段与窗口边界(或其延长线)的交点,属于线段与直线求交问题。

计算机图形学第四讲

计算机图形学第四讲
第一位为1:端点处于上边界的上方 第二位为1:端点处于下边界的下方 第三位为1:端点处于右边界的右方 第四位为1:端点处于左边界的左方 否则,相应位为0
11
1001 0001
xL
A
B
C
1000 0000 E 裁剪窗口 0100
xR
第4讲 图形裁剪算法
1010 D yT 0010
7
第4讲 图形裁剪算法
直线裁减的效率策略
首先,通过方法来快速判断完全在窗口内和完全 在窗口外的直线 若是部分在窗口内的情况,则设法减少直线的求 交次数和每次的求交计算量
8
第4讲 图形裁剪算法
直线裁剪算法
Cohen-Sutherland裁剪算法 中点分割算法 梁友栋-Barsky裁剪算法
9
第4讲 图形裁剪算法
Cohen-Sutherland裁剪算法(编码裁剪法)
基本思想:对于每条待裁剪的线段P1P2分三种情 况处理
若P1P2完全在窗口内,则显示该线段 若P1P2完全在窗口外,则丢弃该线段 若线段不满足上述条件,则求线段与窗口边界的交点, 在交点处把线段分为两段,其中一段完全在窗口外, 可舍弃之,然后对另一段重复上述处理
P1
P1
P1
A
Pm
A Pm A B B P2
B Pm
18
P2
P2
第4讲 图形裁剪算法
算法特点
对分辨率为2N×2N的显示器,上述二分过程至多 进行N次 主要过程只用到加法和除法运算,适合硬件实现, 它可以用左右移位来代替乘除法,这样就大大加 快了速度
19
第4讲 图形裁剪算法
梁友栋-Barsky裁剪算法
13
第4讲 图形裁剪算法

裁剪III(计算机图形学)

裁剪III(计算机图形学)
( y 1 YT ) y 2 y1
2009-2010-2:CG:SCUEC
14
多边形裁剪-凸多边形的二维裁剪
多边形是由一组线段围成的封闭区域,线段裁剪是多边形 裁剪的基础。下图(b)是多边形的线段被裁剪后的结果,但 已不再是封闭的区域。正确的剪裁结果应是一个有边界的区 域,即裁剪后的结果仍是一个(或多个)多边形 ,这就要求
x t x R x 0 y t y0 yB y t y T y 0

QR x QB y QT y
则有 t Q i D i i L , R , B , T
2009-2010-2:CG:SCUEC
3
梁友栋-Barsky算法
凸多边形裁剪区域
3) N (P(t)-A) < 0,则P(t)在L外侧。
性质1表明,P(t)在凸多边形内的充要条件是,对于凸多边形边界上 任意一点A和该处内法向量N,都有N (P(t)-A) 0 。
2009-2010-2:CG:SCUEC
9
Cyrus-Beck算法
现假设多边形有k条边,在每条边界Li上取1个点 Ai ,该点处的内法 向量Ni(i=1,2,…,k),则可见线段的参数区间为下列不等式组的解

t Q i D i i L , R , B , T
i , j { L , R }i j
Dj Di (Q i 0 ) t (Q j 0 ) Q Qj i D Dj i (Q i 0 ) t (Q j 0 ) Qj Qi 0 t 1
i , j { B , T }i j
2009-2010-2:CG:SCUEC
4
梁友栋-Barsky算法

计算机图形学 第5章 裁剪

计算机图形学 第5章 裁剪

3.直线裁剪实例 例5.1 用编码算法裁剪如图5-3(a)所示中的直线段 AB。
图5-3 AB线段的裁剪过程
例5.2 用编码算法裁剪如图5-4(a)所示中的直线段MN。
图5-4 MN线段的裁剪过程
5.1.2 中点分割算法 算法步骤:输入线段端点p1,p2;对于端点p2: (1) p2是否可见,若可见,则它为离p1最远的可见点, 处理结束。 (2) plp2是否全不可见,若是,没有输出,处理结束。 (3) 让pa = p1,pb = p2。
边 V1V2 V2V3 V3V4 V4V5 V5V1 n (1,1) (4,-3) (-1,-2) (-4,3) (0,1) f (2,0) (3,6) (3,6) (4,0) (2,0) w [-4,1] [-5,-5] [-5,-5] [-6,1] [-4,1] w· n -3 -5 15 27 1 D· n 11 30 -13 -30 2 -1/2 tL 3/11 1/6 15/13 9/10 tu
外裁剪有两个重要的应用。
(1) 应用于凹多边形裁剪窗口的线段裁剪。如图5-9 所示线段p1p2相对于凹多边形vlv2v3v4v5v1进行裁剪。 连接v2v4,v1v2v4v5v1为凸多边形,应用Cyrus-Beck算 法,先将p1p2对此凸多边形作内裁剪得到,再将对多 边形v2v3v4v2作外裁剪,最后得到窗口内部分为和。
(4) 沿vi+1p1将多边形一分为二,一个多边形由vi+1, vi+2,…, p1vi+1组成,另一个多边形由vip1及其余顶点组 成。 (5) 对分割的两个多边形递归地重复以上步骤,直到 所有新产生的多边形均为凸,算法结束。
5.1.7 Sutherland-Hodgman逐次多边形裁剪算法 多边形由顶点表p1, p2,…, pn所定义,于是边表为p1p2, p2p3,…, pn-1pn和pn p1。算法的基本思想是将原多边形和 每次裁剪所生成的多边形逐次对裁剪窗口的每一条边 界进行裁剪。考虑图5-12(a)原多边形被窗口左边界所 裁剪,如图5-12(b)所示;生成的多边形又被窗口顶边 所裁剪,如图5-12(c)所示;继续这一过程,生成的中 间多边形被窗口的右边界,如图5-12(d)所示,直至下 边界裁剪完,如图5-12(e)所示为止。

计算机图形学之裁剪算法

计算机图形学之裁剪算法

窗口特别小的场合。
2、中点裁剪法
中点分割裁剪法是将Cohen-Sutherland 算法中求线段与窗口边界的交点的过程用折 半查找(即求中点)的方法来代替。仍然采 用对线段端点进行编码的方式判断完全可见 和显然完全不可见的线段,对于与窗口有交 点的线段,该算法分别求离两个端点最近 (或最远)的可见点。这两个可见点之间的 线段即是原线段的可见部分。
计算P1P2的最近可见点Pma和 Pmb : (一)直线段P1P2的一个端点可见, P1 另一个端点不可见。 只需解算不可见端点的最近的 可见点。 1)设P1不可见,计算P1P2的中点Pm1。
P1
pm
P2
P2
判断中点Pm1如果落在(接近)窗口边上,则 确定该中点为最近可见点。裁剪结束。否则,
2)判断Pm1是否可见: 如果Pm1可见,以Pm1取代P2 ,返回到 1)计算 P1Pm1的中点Pm2,判断Pm2 如果Pm1不可见,以Pm1取代P1 ,返回到 1)计 算Pm1P2的中点Pm2,判断Pm2
关键: 根据多边形的边表,逐 次对每一段边与裁剪线 (窗口边直线)比较,判 别输入顶点的个数和坐 标,并联结成封闭多边 形。
不可见侧
2
多边形边与裁剪线相对位置的四种
情况与处理方法: (1) 位于可见一侧:输出终点作 为新多边形顶点 (2) 位于不可见一侧:不输出 (3) 由可见到不可见:输出与裁剪
P2
两种线段裁剪算法的比较
Cohen-Sutherland算法是最早的、使用最广泛的线
段裁剪算法之一。在裁剪窗口很大,大部分线段完全
可见,或裁剪窗口很小,大部分线段完全不可见的情 况下,该算法特别有效;在一般情况下,该算法有时 要做不必要的求交运算,因而效率不是太高.

计算机图形学 图形裁剪

计算机图形学 图形裁剪
弃线段还是改变交点的参数.
一 当p<0时,参数r用于更新u0: u0=max u0,rk 二 当p>0时,参数r用于更新u一: u一=min u一,rk 三 如果更新了u0或u一后,使u0>u一,则舍弃该线段 四 当p=0且q<0时,因为线段平行于边界并且位于边界之外,则舍
弃该线段.
四、p、q的四个值经判断后,如果该线段未被舍弃,则裁
16
Cohen-Sutherland裁剪算法
求交
将两个端点的编码CtCbCrCl进行逻辑或操作, 根据其结果中一的位置来确定可能相交的窗口边 求交按照固定的顺序来进行 左右下上或上下右左 一条线段与窗口最多求交四次
A 一0一0 FD
E C B 0一0一
17
Cohen-Sutherland裁剪算法
1001
1000
1010
0001
0000
0010
utherland裁剪算法
先排除简单情形:
若某线段两个端点的四位二进制编码全为0000 线段位于窗口内,显示之
若对两端点的四位二进制编码进行逻辑与运算 & 结果
不为0 线段位于窗口外,直接舍弃
1001
不仅在于求出新的顶点,删去界外顶点,还在于形成 正确的顶点序列
36
多边形的描述方式
多边形可以描述为一组顶点按一定顺序连接而成的 有向点列
一般可将多边形的顶点按逆时针方向顺序形成有向 线段,进而连接成一个环来描述多边形的组成
数据结构上,可用链表结构来描述
2
1
3 4
37
多边形裁剪的特点
多边形的各条边是顺次连接 直线裁剪
10
Cohen-Sutherland裁剪算法

vatti裁剪算法

vatti裁剪算法

vatti裁剪算法Vatti裁剪算法是计算机图形学中非常重要的一种算法,它可以对图形进行裁剪以避免渲染过多无用区域,提高图形渲染效率。

下面,我将详细介绍Vatti裁剪算法的原理及其使用方法。

一、概述Vatti裁剪算法最初由Vatti在1984年提出,并在1992年得到了完整的形式化描述。

该算法主要用于多边形裁剪,它将多边形的裁剪视为一系列直线段的计算,从而避免了复杂的多边形运算,减少了计算量。

二、原理Vatti裁剪算法的原理可以简单概括为:将裁剪区域表示为一系列半平面的交集,将多边形表示为一系列线段的并集,然后对这两个集合进行运算,得到裁剪后的多边形。

具体来说,Vatti裁剪算法主要分为两个阶段:首先将裁剪区域表示为n个闭合的凸多边形的交集,然后将多边形分解为线段,并依次对每个线段进行裁剪运算。

1. 裁剪区域的表示a. 输入:在平面上给出n个凸多边形,表示为每个多边形的顶点。

b. 输出:一个表示裁剪区域的半平面集合。

c. 算法步骤:(1) 将每个凸多边形表示为一系列有向线段。

(2) 对每个有向线段Si,计算其左侧半平面:对于多边形中的每个顶点Vj,如果它在Si的左侧,则计算对应的另一个有向线段S'j,使得S'j与Si组成一个包含多边形的半平面。

(3) 重复步骤2,以便得到n个半平面。

(4) 对这n个半平面进行交集运算,得到裁剪区域。

2. 多边形裁剪a. 输入:一个表示多边形的线段集合,以及表示裁剪区域的半平面集合。

b. 输出:裁剪后的多边形。

c. 算法步骤:(1) 将多边形表示为一系列线段的并集。

(2) 对于每条线段Si,计算其与半平面集合的交集。

(3) 将线段的交集组成一个新的集合S',作为裁剪后的多边形。

三、使用方法1. 准备工作在进行Vatti裁剪算法之前,需要准备好多边形的顶点和裁剪区域的半平面集合。

多边形的顶点可以通过手动或程序计算得到,而裁剪区域的半平面集合则需要根据具体需求进行计算。

计算机图形学的裁剪算法

计算机图形学的裁剪算法

计算机图形学的裁剪算法
计算机图形学的裁剪算法是图形学的一种重要算法,它的基本思想是将一个完整的几何图形(如线段、多边形、圆圈等)按照指定的裁剪窗口(矩形)进行裁剪,只保留在窗口内的部分,而把窗口外的部分抛弃掉。

由于裁剪算法的应用非常广泛,像图形显示系统、图形设备接口(GDI)和图形处理器(GPU)等都广泛使用裁剪算法。

计算机图形学的裁剪算法可以分为两种:2D裁剪算法和
3D裁剪算法。

2D裁剪算法是基于二维空间的,它将一个几何
图形投影到一个平面上,然后按照指定的窗口裁剪;而3D裁
剪算法是基于三维空间的,它将一个几何图形投影到一个三维空间,然后按照指定的窗口裁剪。

2D裁剪算法的基本步骤如下:首先,将要裁剪的几何图
形投影到平面上;其次,计算出投影后的几何图形以及裁剪窗口之间的交点;最后,将裁剪窗口内的部分保留,而把窗口外的部分抛弃掉。

3D裁剪算法的基本步骤如下:首先,将要裁剪的几何图
形投影到三维空间;其次,计算出投影后的几何图形以及裁剪窗口之间的交点;最后,将裁剪窗口内的部分保留,而把窗口外的部分抛弃掉。

计算机图形学的裁剪算法在图形处理中有着重要的作用,它不仅能够有效减少图形处理时间,而且还可以节约存储空间。

此外,它还可以有效提高图形处理效率,提高图形显示效果。

但是,它也存在着一定的局限性,比如,当几何图形的运动变得复杂时,它就会变得费时费力,这就对性能产生了一定的影响。

总之,计算机图形学的裁剪算法是图形学的重要算法,它的应用非常广泛,在图形处理中有着重要的作用。

虽然它也存在着一定的局限性,但是它仍然是一种有效的图形处理算法。

第07部分_计算机图形学_裁剪

第07部分_计算机图形学_裁剪
2015/11/14 第8部分 裁剪 第3页
P(t)=(P2-P1)t+P1
Ni ( P(t ) Ai ) 0(i 1,2,, k ) 0 t 1 Ni ( P 1 Ai ) N i ( P 2 P 1 )t 0 0 t 1
2015/11/14
第8部分 裁剪
第6页
程序实现
void LB_LineClip(x1,y1,x2,y2,XL,XR,YB,YT) float x1,y1,x2,y2,XL,XR,YB,YT; { float dx,dy,u1,u2; tl=0;tu=1;dx =x2-x1;dy =y2-y1; if(ClipT(-dx,x1-Xl,&u1,&u2) if(ClipT(dx,XR-x1, &u1,&u2) if(ClipT(-dy,y1-YB, &u1,&u2) if(ClipT(dy,YT-y1, &u1,&u2) { displayline(x1+u1*dx,y1+u1*dy, x1+u2*dx,y1+u2*dy) return; } }
2015/11/14
第8部分 裁剪
第12页
三维裁剪

编码方法
– Cohen-Sutherland算法 – 中点分割算法

参数化裁剪算法
– Cyrus-Beck算法
• 二维向量换成三维向量 • 边法向量换成面法向量
2015/11/14
第8部分 裁剪
第13页
字符裁剪

字符裁剪分类
– 串精度:将包围字串的外接矩形对窗口作裁剪。 – 字符精度:将包围字的外接矩形对窗口作裁剪。 – 象素精度:将笔划分解成直线段对窗口作裁剪。

计算机图形学-NLN线段剪裁算法

计算机图形学-NLN线段剪裁算法

3、点p1的第三种状态
• 点p1在裁剪窗口的左上角区域,这种状态又将p1的位置 分为两种进行讨论,即靠近上边界的和靠近左边界的两 种位置。如图 p1
p1 L2 L2
L1
L3 L4 L4
L3
L1
P1位置判别
kp1a>kab,p1为下图a所示; Kp1a<kab,p1为下图b所示;
如果靠近上边界
• • • • 如果靠近上边界,那么 (1)当k>=k1 && k<=k2时, 当p2在裁剪窗口的内部,求交点 y=YT; x=(y-y1)/(y2-y1)*(x2-x1) ;交点 (x,y),那么点p2与交点的连线就是我们的 裁剪结果 • 当p2在裁剪窗口的外部,此时我们需要求 两个交点 • x0=XR; y0 =(y2-y1)/(x2-x1) *(x0-x1);交 点(x0,y0) • y=YT; x=(y-y1)/(y2-y1)*(x2-x1) ;交点 (x,y),那么两个交点的连线就是我们的裁 剪结果。
2、点p1在裁剪窗口的正左边
L1 L2
p1
p2
L3
L4
• 端点p2的位置有两种选择,在裁剪窗口内部或在裁剪窗口的外 面,利用点p2的编码来判断,即如果codep2==0,那么点p2在 裁剪窗口内部;否则点p2在裁剪窗口外部。???????? • (1)当k>=k2 && k<=k1时, • 当p2在裁剪窗口的内部,求交点 • x=XL;y =k*(x-x1);交点是(x,y),那么点p2与交点的连线就是 的裁剪结果; • 当p2在裁剪窗口的外部,此时我们需要求两个交点 • x0=XL; y0 =k*(x0-x1);交点(x0,y0) • y=YT; x=k*(x2-x1) ;交点(x,y),两个交点的连线就是裁剪结 果。

梁友栋裁剪算法

梁友栋裁剪算法

梁友栋裁剪算法梁友栋裁剪算法是计算机图形学中的一种裁剪算法,主要用于将一个多边形或直线段与一个矩形框进行裁剪。

该算法由梁友栋提出,因此得名。

该算法的基本思想是:将线段或多边形的端点表示为参数方程式,并通过求解参数方程式与裁剪边界的交点来确定裁剪后的线段或多边形。

具体来说,对于一条线段(或多边形的一条边),假设其起点为P1(x1,y1),终点为P2(x2,y2),则可以将其表示为以下参数方程式:x = x1 + t * (x2 - x1)y = y1 + t * (y2 - y1)其中t取值范围为[0,1]。

这个参数方程式描述了从P1到P2之间所有可能的点。

现在需要判断这条线段是否与矩形框相交,如果相交,则需要找到相交部分并输出。

对于矩形框上下左右四条边,可以分别用以下参数方程式表示:左:x = xmin右:x = xmax上:y = ymax下:y = ymin接下来需要求解线段和每条矩形边界的交点。

以左侧矩形边界为例,将其参数方程式代入线段参数方程式中,得到以下两个方程:x1 + t * (x2 - x1) = xminy1 + t * (y2 - y1) = y解这个方程组可以得到t的值,进而可以求出相交点的坐标。

对于其他边界也是类似的求解过程。

求解出所有相交点后,需要判断哪些部分需要被保留。

对于线段而言,如果起点和终点都在矩形框内,则整条线段需要被保留;如果起点和终点都在矩形框外,则整条线段需要被裁剪掉;如果只有一端在矩形框内,则需要根据相交点位置判断哪一部分需要被保留。

对于多边形而言,可以将每条边看作一个线段,然后分别进行裁剪操作。

裁剪后的所有线段再组合成新的多边形。

梁友栋裁剪算法的优势在于其简单易懂、高效快速、适用范围广泛。

它不仅可以用于二维图形的裁剪,还可以扩展到三维图形中去。

此外,在实际应用中,该算法还常常和其他算法结合使用,如多边形填充算法、图像变换算法等。

总之,梁友栋裁剪算法是计算机图形学中一种重要的裁剪算法,具有广泛的应用前景和研究价值。

计算机图形学裁剪

计算机图形学裁剪
段位于窗口的同一侧,为不可见; 算出直线与窗口的交点,将直线分割,舍去交
点之外的一段,再对另一段重复上述处理。
例题
(1)Code1=0001 Code2=1000 ,该 线段既非完全可见,也非完全不可见;
(2)与窗口左边求交点P3,舍去P1P3 (3)余下的P2P3不能简单判定,与窗
口右边求交点P4,
边和裁减窗口边之间的关系
(1) SP与窗口边 界的交点I与P均 被加入到输出顶 点表中
(2) P加入到输 出顶点表中
(3) SP与窗口边 界的交点I被加 入到输出顶点表 中
(4) 输出顶点表 中不增加任何顶 点
例题
退化情况
结论
凸多边形用此算法可以获得正确的裁剪结果, 而且可以推广到任意凸多边形窗口的情况。
(2)小窗口的场合,其中大部分线段为完全不 可见
但是求交计算较复杂
实验
利用Cohen-Sutherland算法实现直线的 裁剪
要求:裁剪窗口为矩形,可以对任意位 置直线进行裁剪。
中点分割法
中点分割算法的核心思想是通过 二分逼近来确定直线段与窗口的 交点。
是Sproul 和Sutherland为了便于 硬件实现而提出的。
舍去P5P4; (5)P3P4为完全可见线段。
舍去的这一段,应该是窗口外一端点到 交点之间这一段
如何减少求交次数?
验证两端点各位编码值,相异则求交。
该算法的特点
该算法用编码的方法实现了对完全可见 和不可见直线段的快速接受和拒绝,这 使得它在两类裁剪场合中非常高效:
(1)大窗口的场合,其中大部分线段为完全可 见;
第四章 二维图形裁剪
裁剪技术
所谓裁剪技术,就是按预先设置的窗口 参数,沿窗口边框线对图形进行裁剪, 保留窗口内部图形,裁剪掉窗口外图形 的方法。

计算机图形学5.5裁剪算法

计算机图形学5.5裁剪算法
如何求窗口边界与线段P1P2的交点?
如何判定线段应该与窗口的哪条边求交呢?
编码中对应位为1的窗口边。
计算线段P1(x1,y1)P2(x2,y2)与窗口边界的交点 Code代表线段某个端点的编码。 if(LEFT&code !=0)
{ x=XL; y=y1+(y2-y1)*(XL-x1)/(x2-x1);} else if(RIGHT&code !=0) { x=XR; y=y1+(y2-y1)*(XR-x1)/(x2-x1);} else if(BOTTOM&code !=0) { y=YB; x=x1+(x2-x1)*(YB-y1)/(y2-y1);} else if(TOP & code !=0) { y=YT; x=x1+(x2-x1)*(YT-y1)/(y2-y1);}
P4 (1010)
上下右左 □□□□
P1 (1001)
Y=YT
P3: 0110 P4:& 1010
0010
X=XL
P1: 1001 P2:& 0010
0000
P2 (0010)
X=XR
Y=YB P3 (0110)
对于三维裁剪,需要6位编码。
一旦给定所有的线段端点的区域码,就可以快速 判断哪条直线完全在剪取窗口内,哪条直线完全在 窗口外。所以得到一个规律:
4.求交:假定直线的端点坐标为(x1, y1)和(x2, y2) (1)左、右边界交点的计算:y=y1+k(x-x1); (2)上、下边界交点的计算:x=x1+(y-y1)/k。
Cohen-Sutherland端点编码算法
优点:简单,易于实现。 特点:用编码方法可快速判断线段的完全可见和 显然不可见。

裁剪II(计算机图形学)

裁剪II(计算机图形学)

5. AP2的中点为P3,AP3简弃,再处理P3P2, 其中点为P4, 得到与A最近的点P4 6. P1P2的中点为P5, P5P2可简取,处理P1P5 7. P1P5的中点P6,简弃P6P1,得到与B最近的点P6 8. 处理完毕,得到裁剪结果 P4P6
B
中点分割裁剪算法演示例子
12
2009-2010-2:CG:SCUEC
XL
0000 A
0010
YB
0101
0100
XR
0110
2009-2010-2:CG:SCUEC
2
端点(x,y)编码流程
初值flag =0 y>YT Y flag首位为1 N N y<YB Y Flag第二位为1 N N
x>XR Y flag第三位为1
x<XL Y flag第四位为1
返回
2009-2010-2:CG:SCUEC
2009-2010-2:CG:SCUEC
10
中点分割裁剪算法框图
P0可见否? N P0P1显然不可见 N Pm= (P0+P1)/2 Y Y A= P0 exit 原线完全不可见 exit
|Pm – P0|<ε? N
Y A= Pm exit
P0Pm显然不可见?
Y P0 = Pm N P1= Pm
2009-2010-2:CG:SCUEC
3
Sutherland-Cohen裁剪算法-判断
对要被裁剪的线段的两个端点, 如果其所在的区域的编码均是 0000,则这条线段完全可见; 比如线段AB,两端点的编 码都为0000
1001 G 0001 A 1000 B 0000 1010
E
0010 F L 0110 K

计算机图形学实验四 :裁剪

计算机图形学实验四 :裁剪

贵州大学实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科131glColor3f(0.0f, 1.0f, 0.0f);glVertex2f(x1, y1);glEnd();}//矩形的结构体typedef struct Rectangle{float xmin;float xmax;float ymin;float ymax;} Rectan;Rectan rect;int x0, y0, x1, y1;//求出坐标点的Cohen-Sutherland编码int CompCode(int x, int y, Rectan rect) {int code = 0x00;if (y < rect.ymin){code = code | 4;}if (y>rect.ymax){code = code | 8;}if (x>rect.xmax){code = code | 2;}if (x<rect.xmin){code = code | 1;}return code;}//裁剪直线int cohensutherlandlineclip(Rectan rect, int& x0, int& y0, int& x1, int& y1) {int accept = 0, done = 0;float x, y;int code0, code1, codeout;int x00 = x0, y00 = y0, x11 = x1, y11 = y1;code0 = CompCode(x0, y0, rect);code1 = CompCode(x1, y1, rect);//直线全部在矩形框内部,应保留if (!(code0 | code1)){accept = 1;done = 1;}//直线和矩形不相交,并且划直线的两点在矩形同侧(上、下、右。

计算机图形学裁剪算法详解

计算机图形学裁剪算法详解

裁剪算法详解在使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的只是图的一部分。

因此需要确定图形中哪些部分落在显示区之内,哪些落在显示区之外,以便只显示落在显示区内的那部分图形。

这个选择过程称为裁剪。

最简单的裁剪方法是把各种图形扫描转换为点之后,再判断各点是否在窗内。

但那样太费时,一般不可取。

这是因为有些图形组成部分全部在窗口外,可以完全排除,不必进行扫描转换。

所以一般采用先裁剪再扫描转换的方法。

(a)裁剪前(b) 裁剪后图1.1 多边形裁剪1直线段裁剪直线段裁剪算法比较简单,但非常重要,是复杂图元裁剪的基础。

因为复杂的曲线可以通过折线段来近似,从而裁剪问题也可以化为直线段的裁剪问题。

常用的线段裁剪方法有三种:Cohen-Sutherland,中点分割算法和梁友栋-barskey算法。

1.1 Cohen-Sutherland裁剪该算法的思想是:对于每条线段P1P2分为三种情况处理。

(1)若P1P2完全在窗口内,则显示该线段P1P2简称“取”之。

(2)若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。

(3)若线段既不满足“取”的条件,也不满足“弃”的条件,则在交点处把线段分为两段。

其中一段完全在窗口外,可弃之。

然后对另一段重复上述处理。

为使计算机能够快速判断一条直线段与窗口属何种关系,采用如下编码方法。

延长窗口的边,将二维平面分成九个区域。

每个区域赋予4位编码CtCbCrCl.其中各位编码的定义如下:图1.2 多边形裁剪区域编码图5.3线段裁剪裁剪一条线段时,先求出P1P2所在的区号code1,code2。

若code1=0,且code2=0,则线段P1P2在窗口内,应取之。

若按位与运算code1&code2≠0,则说明两个端点同在窗口的上方、下方、左方或右方。

可判断线段完全在窗口外,可弃之。

否则,按第三种情况处理。

求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段在窗口外,可弃之。

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

裁剪算法详解在使用计算机处理图形信息时,计算机部存储的图形往往比较大,而屏幕显示的只是图的一部分。

因此需要确定图形中哪些部分落在显示区之,哪些落在显示区之外,以便只显示落在显示区的那部分图形。

这个选择过程称为裁剪。

最简单的裁剪方法是把各种图形扫描转换为点之后,再判断各点是否在窗。

但那样太费时,一般不可取。

这是因为有些图形组成部分全部在窗口外,可以完全排除,不必进行扫描转换。

所以一般采用先裁剪再扫描转换的方法。

(a)裁剪前 (b) 裁剪后图1.1 多边形裁剪1直线段裁剪直线段裁剪算法比较简单,但非常重要,是复杂图元裁剪的基础。

因为复杂的曲线可以通过折线段来近似,从而裁剪问题也可以化为直线段的裁剪问题。

常用的线段裁剪方法有三种:Cohen-Sutherland,中点分割算法和梁友栋-barskey 算法。

1.1 Cohen-Sutherland裁剪该算法的思想是:对于每条线段P1P2分为三种情况处理。

(1)若P1P2完全在窗口,则显示该线段P1P2简称“取”之。

(2)若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。

(3)若线段既不满足“取”的条件,也不满足“弃”的条件,则在交点处把线段分为两段。

其中一段完全在窗口外,可弃之。

然后对另一段重复上述处理。

为使计算机能够快速判断一条直线段与窗口属何种关系,采用如下编码方法。

延长窗口的边,将二维平面分成九个区域。

每个区域赋予4位编码CtCbCrCl.其中各位编码的定义如下:图1.2 多边形裁剪区域编码图5.3线段裁剪裁剪一条线段时,先求出P1P2所在的区号code1,code2。

若code1=0,且code2=0,则线段P1P2在窗口,应取之。

若按位与运算code1&code2≠0,则说明两个端点同在窗口的上方、下方、左方或右方。

可判断线段完全在窗口外,可弃之。

否则,按第三种情况处理。

求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段在窗口外,可弃之。

在对另一段重复上述处理。

在实现本算法时,不必把线段与每条窗口边界依次求交,只要按顺序检测到端点的编码不为0,才把线段与对应的窗口边界求交。

Cohen-Sutherland裁减算法#define LEFT 1#define RIGHT 2#define BOTTOM 4#define TOP 8int encode(float x,float y){ int c=0;if(x<XL) c|=LEFT;if(x>XR) c|=RIGHT;if(x<YB) c|=BOTTOM;if(x<YT) c|=TOP;retrun c;}void CS_LineClip(x1,y1,x2,y2,XL,XR,YB,YT)float x1,y1,x2,y2,XL,XR,YB,YT;//(x1,y1)(x2,y2)为线段的端点坐标,其他四个参数定义窗口的边界{ int code1,code2,code;code1=encode(x1,y1);code2=encode(x2,y2);while(code1!=0 ||code2!=0){ if(code1&code2 !=0) return;code = code1;if(code1==0) code = code2;if(LEFT&code !=0){ x=XL;y=y1+(y2-y1)*(XL-x1)/(x2-x1);}else if(RIGHT&code !=0){ x=XR;y=y1+(y2-y1)*(XR-x1)/(x2-x1);}else if(BOTTOM&code !=0){ y=YB;x=x1+(x2-x1)*(YB-y1)/(y2-y1);}else if(TOP & code !=0){ y=YT;x=x1+(x2-x1)*(YT-y1)/(y2-y1);}if(code ==code1){ x1=x;y1=y; code1 =encode(x,y);}else{ x2=x;y2=y; code2 =encode(x,y);}}displayline(x1,y1,x2,y2);}1.2 中点分割裁剪算法中点分割算法的大意是,与前一种Cohen-Sutherland算法一样首先对线段端点进行编码,并把线段与窗口的关系分为三种情况: 全在、完全不在和线段和窗口有交。

对前两种情况,进行一样的处理。

对于第三种情况,用中点分割的方法求出线段与窗口的交点。

即从p0点出发找出距p0最近的可见点A和从p1点出发找出距p1最近的可见点B,两个可见点之间的连线即为线段p0p1的可见部分。

从p0出发找最近可见点采用中点分割方法:先求出p0p1的中点pm,若p0pm 不是显然不可见的,并且p0p1在窗口中有可见部分,则距p0最近的可见点一定落在p0pm上,所以用p0pm代替p0p1;否则取pmp1代替p0p1。

再对新的p0p1求中点pm。

重复上述过程,直到pmp1长度小于给定的控制常数为止,此时pm 收敛于交点。

由于该算法的主要计算过程只用到加法和除2运算,所以特别适合硬件实现,同时也适合于并行计算。

图5.4 A、B分别为距p0、p1最近的可见点,Pm为p0p1中点1.3梁友栋-Barskey算法梁友栋和Barskey提出了更快的参数化裁剪算法。

首先按参数化形式写出裁剪条件:这四个不等式可以表示为形式:其中,参数p k,q k定义为:任何平行于裁剪边界之一的直线p k=0,其中k对应于裁剪边界(k=1,2,3,4对应于左、右、下、上边界)如果还满足q k<0,则线段完全在边界外,舍弃该线段。

如果q k≥0,则该线段平行于裁剪边界并且在窗口。

当p k<0,线段从裁剪边界延长线的外部延伸到部。

当p k>0,线段从裁剪边界延长线的部延伸到外部。

当p k≠0,可以计算出线段与边界k的延长线的交点的u 值:u=q k/p k对于每条直线,可以计算出参数u1和u2,它们定义了在裁剪矩形的线段部分。

u1的值由线段从外到遇到的矩形边界所决定(p<0)。

对这些边界计算r k=q k/p k。

u1取0和各个r k值之中的最大值。

u2的值由线段从到外遇到的矩形边界所决定(p>0)。

对这些边界计算r k=q k/p k。

u2取1和各个r k值之中的最小值。

如果u1>u2,则线段完全落在裁剪窗口之外,被舍弃。

否则裁剪线段由参数u的两个值u1,u2计算出来。

void LB_LineClip(x1,y1,x2,y2,XL,XR,YB,YT)float x1,y1,x2,y2,XL,XR,YB,YT;{ float dx,dy,u1,u2;tl=0;tu=1;dx =x2-x1;dy =y2-y1;if(ClipT(-dx,x1-Xl,&u1,&u2)if(ClipT(dx,XR-x1, &u1,&u2)if(ClipT(-dy,y1-YB, &u1,&u2)if(ClipT(dy,YT-y1, &u1,&u2){ displayline(x1+u1*dx,y1+u1*dy, x1+u2*dx,y1+u2*dy)return;}}bool ClipT(p,q,u1,u2)float p,q,*u1,*u2;{ float r;if(p<0){ r=q/p;if(r>*u2)return FALSE; else if(r>*u1){ *u1=r;return TRUE;}}else if(p>0){ r=p/q;if(r<*u1) return FALSE;else if(r<*u2){ *u2=r;return TRUE;}}else if(q<0) return FALSE;return TRUE;}2 多边形裁剪对于一个多边形,可以把它分解为边界的线段逐段进行裁剪。

但这样做会使原来封闭的多边形变成不封闭的或者一些离散的线段。

当多边形作为实区域考虑时,封闭的多边形裁剪后仍应当是封闭的多边形,以便进行填充。

为此,可以使用Sutherland-Hodgman算法。

该算法的基本思想是一次用窗口的一条边裁剪多边形。

算法的每一步,考虑窗口的一条边以及延长线构成的裁剪线。

该线把平面分成两个部分:一部分包含窗口,称为可见一侧;另一部分称为不可见一侧。

依序考虑多边形的各条边的两端点S、P。

它们与裁剪线的位置关系只有四种。

(1)S,P 均在可见一侧(2)S,P均在不可见一侧(3)S可见,P不可见(4)S不可见,P可见。

图1.3 S、P与裁剪线的四种位置关系每条线段端点S、P与裁剪线比较之后,可输出0至两个顶点。

对于情况(1)仅输出顶点P;情况(2)输出0个顶点;情况(3)输出线段SP与裁剪线的交点I;情况(4)输出线段SP与裁剪线的交点I和终点P上述算法仅用一条裁剪边对多边形进行裁剪,得到一个顶点序列,作为下一条裁剪边处理过程的输入。

对于每一条裁剪边,算法框图一样,只是判断点在窗口哪一侧以及求线段SP与裁剪边的交点算法应随之改变。

基于divide and conquer策略的Sutherland-Hodgman算法typedef struct{ float x; float y; }Vertex;typedef Vertex Edge[2];typedef Vertex VertexArray[MAX];SutherlandHodgmanClip(VertexArray InVertexArray, VertexArray OutVertexArray, edge ClipBoundary, int &Inlength, int &Outlength){ Vertex s, p, ip;int j;Outlength = 0;S = InVertexArray [InLength -1];For (j = 0; j < Inlength; j++){P = InVertexArray [j];if(Inside (P, ClipBoundary)){ if(Inside (S, ClipBoundary)) //SP在窗口,情况1 Output(p, OutLength, OutVertex Array)else{ //S在窗口外, 情况4Intersect (S, P, ClipBoundary, &ip);Output (ip, OutLength, OutVertexArray);Output (P, OutLength, OutVertexArray);}}else if (Inside (S, WindowsBoundary)){ //S在窗口,P在窗口外,情况3Intersect (S, P, ClipBoundary, &ip);Output (ip, OutLength, OutVertexArray);} //情况2没有输出S = P;}}//判点在窗口bool Inside (Vertex &TestPt, Edge ClipBoundary){ if(ClipBoundary[1].x> ClipBoundary[0].x)//裁剪边为窗口下边if(testpt.y>= ClipBoundary[0].y)return TRUE;else if(ClipBoundary[1].x< ClipBoundary[0].x) //裁剪边为窗口上边if(testpt.y<= ClipBoundary[0].y)return TRUE;else if(ClipBoundary[1].y> ClipBoundary[0].y) //裁剪边为窗口右边 if(testpt.x<= ClipBoundary[0].x)return TRUE;else if(ClipBoundary[1].y< ClipBoundary[0].y) //裁剪边为窗口左边 if(testpt.x>= ClipBoundary[0].x)return TRUE;Return FALSE;}//直线段SP和窗口边界求交,返回交点;void Intersect (Vertex&S,Vertex &P,Edge ClipBoundary,Vertex& IntersectPt){ if(ClipBoundary[0].y== ClipBoundary[1].y)//水平裁剪边{ IntersectPt.y = ClipBoundary[0].y;IntersectPt.x = S.x+( ClipBoundary[0].y -s.y)*(p.x - s.x) / (p.y - s.y);}else //垂直裁剪边{ Intersect.x = ClipBoundary[0].x;Intersect.y = s.y + (ClipBoundary[0].x - s.x)*(p.y - s.y) / (p.x. - s.x);}}。

相关文档
最新文档