计算机图形学裁剪
chapt 6-1 裁剪——计算机图形学课件PPT
![chapt 6-1 裁剪——计算机图形学课件PPT](https://img.taocdn.com/s3/m/23e6959158fb770bf68a5558.png)
code1&code2≠0,对直线段可简弃之,转(7);当上述两条均 不满足时,进行步骤(4)。 (4)确编保码p。1在窗口外部:若p1在窗口内,则交换p1和p2的坐标值和 (5)按左、右、上、下的顺序求出直线段与窗口边界的交点,并 用分可以该为去交二掉点,p的并1s坐去。标掉转值p(21s)替。这换一p段1的。坐考标虑值到。p也1是即窗在口交外点的s一处点把线,段因一此 (6)用直线扫描转换算法画出当前的直线段p1p2。 (7)算法结束。
延长线与窗口矩形边界的交点
A
实交点
实交点 H
I 虚交点
G
F
窗口
虚交点 JD
实交点
E
B
虚交点
C
图6-25 实交点与虚交点
计算机图形学
1. Cohen-Sutherland算法
基本思想:对每条直线段p1(x1,y1)p2(x2,y2)分三种情况处理: (1) 直线段完全可见,“简取”之。 (2) 直线段完全不可见,“简弃”之。 (3) 直线段既不满足“简取”的条件,也不满足“简弃”
计算机图形学
5.2 二维裁剪
• 在二维观察中,需要在观察坐标系下对窗口进行裁剪,即只保留 窗口内的那部分图形,去掉窗口外的图形。
• 假设窗口是标准矩形,即边与坐标轴平行的矩形,由上 (y=wyt)、下(y=wyb)、左(x=wxl)、右( 1 点的裁剪 x=wxr)四条边描述。
• 5.2.1 点的裁剪
vxl
vxr X
(b)屏幕坐标系中的视区
计算机图形学第四讲
![计算机图形学第四讲](https://img.taocdn.com/s3/m/61b8306db84ae45c3b358cb7.png)
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讲 图形裁剪算法
浙江大学工程计算机图形学第五章 裁剪
![浙江大学工程计算机图形学第五章 裁剪](https://img.taocdn.com/s3/m/703f4cd35ef7ba0d4a733bed.png)
图5-1-4
工程及计算机图形学
浙江大学工程及计算机图学所
7
5.1.2 Cohen-Sutherland裁剪算法
一旦给定所有的线段端点的区域 码,就可以快速判断哪条直线完 全在剪取窗口内,哪条直线完全 在窗口外。所以得到一个规律:
第二步: 从P0点向窗口的四个 角点发出射线,这四 条射线和窗口的四条 边所在的直线一起将 二维平面划分为更多 的小区域 。
此时P1的位置决定了P0P1 和窗口边的相交关系。
工程及计算机图形学
图5-1-12
浙江大学工程及计算机图学所
18
5.1.4Nicholl-Lee-Nicholl算法
第三步,确定P1所在的区域
yB <= y <= yT 否则,P点就在窗口外。
工程及计算机图形学
浙江大学工程及计算机图学所
3
5.1.1直接求交算法
直线与窗口 边都写成参数形 式,求参数值。
工程及计算机图形学
图5-1-2
浙江大学工程及计算机图学所
4
5.1.2 Cohen-Sutherland裁剪算法
基本思想:
对于每条线段P1P2分为三种情况处理: (1)若P1P2完全在窗口内,则显示该线段P1P2。 (2)若P1P2明显在窗口外,则丢弃该线段。 (3)若线段不满足(1)或(2)的条件,则在交点
码,并把线段与窗口的关系分为三种情况,对前两种
情况,进行一样的处理;对于第三种情况,用中点分
割的方法求出线段与窗口的交点。A、B分别为距P0 、 P1最近的可见点,Pm为P0P1中点。
计算机图形学 第5章 裁剪
![计算机图形学 第5章 裁剪](https://img.taocdn.com/s3/m/7665f63387c24028915fc3ec.png)
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)所示为止。
计算机图形学的裁剪算法
![计算机图形学的裁剪算法](https://img.taocdn.com/s3/m/4950c5183868011ca300a6c30c2259010202f3dd.png)
计算机图形学的裁剪算法
计算机图形学的裁剪算法是图形学的一种重要算法,它的基本思想是将一个完整的几何图形(如线段、多边形、圆圈等)按照指定的裁剪窗口(矩形)进行裁剪,只保留在窗口内的部分,而把窗口外的部分抛弃掉。
由于裁剪算法的应用非常广泛,像图形显示系统、图形设备接口(GDI)和图形处理器(GPU)等都广泛使用裁剪算法。
计算机图形学的裁剪算法可以分为两种:2D裁剪算法和
3D裁剪算法。
2D裁剪算法是基于二维空间的,它将一个几何
图形投影到一个平面上,然后按照指定的窗口裁剪;而3D裁
剪算法是基于三维空间的,它将一个几何图形投影到一个三维空间,然后按照指定的窗口裁剪。
2D裁剪算法的基本步骤如下:首先,将要裁剪的几何图
形投影到平面上;其次,计算出投影后的几何图形以及裁剪窗口之间的交点;最后,将裁剪窗口内的部分保留,而把窗口外的部分抛弃掉。
3D裁剪算法的基本步骤如下:首先,将要裁剪的几何图
形投影到三维空间;其次,计算出投影后的几何图形以及裁剪窗口之间的交点;最后,将裁剪窗口内的部分保留,而把窗口外的部分抛弃掉。
计算机图形学的裁剪算法在图形处理中有着重要的作用,它不仅能够有效减少图形处理时间,而且还可以节约存储空间。
此外,它还可以有效提高图形处理效率,提高图形显示效果。
但是,它也存在着一定的局限性,比如,当几何图形的运动变得复杂时,它就会变得费时费力,这就对性能产生了一定的影响。
总之,计算机图形学的裁剪算法是图形学的重要算法,它的应用非常广泛,在图形处理中有着重要的作用。
虽然它也存在着一定的局限性,但是它仍然是一种有效的图形处理算法。
计算机图形学-第三章-变换及裁剪
![计算机图形学-第三章-变换及裁剪](https://img.taocdn.com/s3/m/04835dfcb84ae45c3a358c2d.png)
内容
二维变换 三维变换 裁剪
内容
二维变换
齐次坐标表示 基本变换 其它变换
三维变换 裁剪
二维变换
通过二维变换和裁剪,将定义在二维世界 坐标系中的物体变换到以像素为单位的屏 幕坐标系中,实现二维物体的光栅显示
矢量图形、卡通动画
二维图形中常见的变换
齐次坐标表示: 基本变换:平移、旋转、放缩 其它变换:剪切、对称、复合
齐次坐标
所谓齐次坐标表示法就是由n+1维向量表示一个
n 维 向 量 。 如 n 维 向 量 (P1,P2, … ,Pn) 表 示 为
(hP1,hP2, hPn,h),其中h称为哑坐标。
齐次坐标
1、h可以取不同的值,所以同一点的齐次坐标
不是唯一的。如普通坐标系下的点(2,3)变换 为齐次坐标可以是(1,1.5,0.5)(4,6,2)(6,9,3) 等等。
y
0
1
0
y
1 0 0 1 1
关于坐标原点的对称变换
x 1 0 0 x
y
0
1
0
y
1 0 0 1 1
关于X轴的对称变换
x 1 0 0 x
y
0
1
0
y
1 0 0 1 1
关于Y轴的对称变换
对称变换
Y (x,y) O
y=x X
(y,x)
x 0 1 0 x
Y (x',y')
(x,y)
O
X
x' 1 y'0
0 1
xyttxy
采用齐次坐标: (x, y) (x, y, 1)
x 1 0 tx x
y
计算机图形学第五章 PPT
![计算机图形学第五章 PPT](https://img.taocdn.com/s3/m/b46748f3284ac850ad0242f7.png)
下面我们仅介绍如何在线段P1P2上求离P1最 远的可见点 (求P2最远的可见点同p1) ,其 具体步骤如下:
① 测试P2是否在窗口内,若是,则P2就是 离P1最远的可见点,结束。否则,进行下一
(如图中的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 A
B F
思考:前面几种裁剪直线段 算法的裁剪窗口都是矩形区 域,如何推广裁剪区域呢?
中点分割裁剪算法
基本思想: 与前一种Cohen-Sutherland算
法一样首先对线段端点进行编码,并把 线段与窗口的关系分为三种情况: 全部可见、完全不可见和线段部分可见。 对前两种情况,进行一样的处理。对于 第三种情况,用中点分割的方法求出线 段与窗口的交点。
问:算法为什么可行?会不会 无限循环、不断二分?
N·(P(t)-A)>0
参数化算法(Cyrus-Beck)
k条边的多边形,可见线段参数区间的解: Ni·(p(t)-Ai)>=0, i=0,…,k, 0≤t ≤1. 即:Ni·(P1-Ai)+ Ni·(P2-P1) t>=0 可得:
NN i •i•P2P2PN1Pi1•0P2 0 tP1t0N N N N ii ••ii••NPP12iPP12AP1iPAP21iP1
yT为终边。 yT为始边。
Liang-Barsky算法:交点计算
求出P0P1与两条始边的交点参 数t0, t1 , 令 tl=max(t0 ,t1,0),则tL即为 三者中离p1最近的点的参数
计算机图形学裁剪算法
![计算机图形学裁剪算法](https://img.taocdn.com/s3/m/6d2aff5e767f5acfa1c7cd48.png)
一、实验目标1.了解Cohen-SutherLand线段裁剪算法、Liang-Barsky线段裁剪算法、SutherLand-Hodgeman多边形裁剪算法的基本思想;2.掌握Cohen-SutherLand线段裁剪算法、Liang-Barsky线段裁剪算法、SutherLand-Hodgeman多边形裁剪算法的算法实现;二、实验内容本次实验主要是实现Cohen-SutherLand线段裁剪算法、Liang-Barsky线段裁剪算法、SutherLand-Hodgeman多边形裁剪算法。
Cohen-sutherland线段裁剪算法思想:该算法也称为编码算法,首先对线段的两个端点按所在的区域进行分区编码,根据编码可以迅速地判明全部在窗口内的线段和全部在某边界外侧的线段。
只有不属于这两种情况的线段,才需要求出线段与窗口边界的交点,求出交点后,舍去窗外部分。
对剩余部分,把它作为新的线段看待,又从头开始考虑。
两遍循环之后,就能确定该线段是部分截留下来,还是全部舍弃。
Cohen-sutherland线段裁剪算法步骤:1、分区编码延长裁剪边框将二维平面分成九个区域,每个区域各用一个四位二进制代码标识。
各区代码值如图中所示。
四位二进制代码的编码规则是:(1)第一位置1:区域在左边界外侧(2)第二位置1:区域在右边界外侧(3)第三位置1:区域在下边界外侧(4)第四位置1:区域在上边界外侧裁剪窗口内(包括边界上)的区域,四位二进制代码均为0。
设线段的两个端点为P1(x1,y1)和P2(x2,y2),根据上述规则,可以求出P1和P2所在区域的分区代码C1和C2。
2、判别根据C1和C2的具体值,可以有三种情况:(1)C1=C2=0,表明两端点全在窗口内,因而整个线段也在窗内,应予保留。
(2)C1&C2≠0(两端点代码按位作逻辑乘不为0),即C1和C2至少有某一位同时为1,表明两端点必定处于某一边界的同一外侧,因而整个线段全在窗外,应予舍弃。
计算机图形学-第三章-变换及裁剪
![计算机图形学-第三章-变换及裁剪](https://img.taocdn.com/s3/m/fe0dff2bc8d376eeafaa310b.png)
y
0
1
0 y
1 0 0 11
X
(1) 变换过程中, y坐标保持不变,而x坐标值发生线性变化;
(2) 平行于X轴的线段变换后仍平行于X轴,平行于Y轴的线段变换
后错切成与Y轴成固定角的直线
12
对称变换
Y
(-x,y) O
(-x,-y)
(x,y) X
(x,-y)
x 1 0 0 x
y
0
1 0 y
y (x,y)
y (x´,y´)
y
(x´´,y´´)
x
x
Tx
x
解:设点(x,y)为线段上的任意一点,点(x´,y´)为点(x,y)放大后 的坐标,点(x´´,y´´)为点(x´,y´)平移后的坐标,则: [x´ y´ 1]= [x y 1]S2(2,2) [x´´ y´´ 1]= [x´ y´ 1]T2(10,0) [x´´ y´´ 1]= [x´ y´ 1]T2(10,0)=[x y 1]S2(2,2)T2(10,0)
刚体 变换
仿射 变换
17
例1:复合平移
求点P(x,y)经第一次平移变换(Tx1,Ty1),第二次平 移变换(Tx2,Ty2)后的坐标P*(x*, y*)
解:设点P(x,y,1)经第一次平移变换后的坐标为P(x
y 1),则
1 0 0
P'x' y' 1x y 10 1 0x y 1Tt1
Tx1 Ty1 1
第三章 变换与裁剪
内容
二维变换 三维变换 裁剪
2
内容
二维变换
齐次坐标表示 基本变换 其它变换
三维变换 裁剪
3
二维变换
通过二维变换和裁剪,将定义在二维世界 坐标系中的物体变换到以像素为单位的屏 幕坐标系中,实现二维物体的光栅显示
计算机图形学--第五讲 裁剪的基本概念与直线裁剪
![计算机图形学--第五讲 裁剪的基本概念与直线裁剪](https://img.taocdn.com/s3/m/bc8080b34b35eefdc8d333e2.png)
12直线生成算法圆与椭圆的绘制算法5图元的概念436区域填充算法裁剪反走样技术4.5 裁剪—4.5 裁剪—4.5 裁剪—4.5 裁剪—4.5 裁剪—4.5 裁剪—算法实现◆第一步◆第二步4.5 裁剪—编码实现(第一步)九个区域,每一个区域采用四位编码对于任一端点左),赋予一个◆左:若◆右:若◆下:若◆上:若4.5 裁剪—编码实现(第一步)对要被裁剪的线段的两个端点,如果其所在的区域的编码均是如果两个编码的见的,可简弃之;如果两个编码的少一个端点非在交点处把线段一分为二,其中必有一段完全在窗口外,可弃之。
再对另一段重复进行上述处理,直到该线段完全被舍弃或找到位于窗口内的一段线段为止。
4.5 裁剪—析出点。
求出其交点见的,因而只要对上述处理步骤。
y=裁剪结束。
算法步骤界坐标:code2(0100)之,转则交换段与窗口边界的交点除p算法的编码实现到另一端点间的线段重复上述过程直到接受或拒绝;计算线段if(LEFT&codeelse if(RIGHT&codeelse if(BOTTOM&code {y=YB;else if(TOP & code !=0) {y=YT;Cohen-SutherlandNicholl et al. An efficient new algorithm for 2-D line clipping: its4.5 裁剪—4.5 裁剪—4.5 裁剪—(((4.5 裁剪—)界L上;要条件A和该处内法向量P(t)4.5 裁剪—)。
4.5 裁剪—)终点组:N i ⋅(P 2-P 1)<0 起点组:N i ⋅(P 2-P 1)>0 特殊情况:N i ⋅(P 2-P 1)=0这时,,P 1P 2与对应边平行, 这时有两种情况:线段在区域外侧或内侧:前一种情况对应于N i ⋅(P 2-P 1)<0,可直接判断线段在多边形之外前一种情况对应于N i ⋅(P 2-P 1)>0,则不于考虑,继续处理其他边。
计算机图形学5.5裁剪算法
![计算机图形学5.5裁剪算法](https://img.taocdn.com/s3/m/2c69a900b207e87101f69e3143323968011cf4dc.png)
如何判定线段应该与窗口的哪条边求交呢?
编码中对应位为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(计算机图形学)](https://img.taocdn.com/s3/m/c6b94a2b2af90242a895e5bb.png)
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
第07部分_计算机图形学_裁剪
![第07部分_计算机图形学_裁剪](https://img.taocdn.com/s3/m/98765739915f804d2b16c1c0.png)
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页
字符裁剪
字符裁剪分类
– 串精度:将包围字串的外接矩形对窗口作裁剪。 – 字符精度:将包围字的外接矩形对窗口作裁剪。 – 象素精度:将笔划分解成直线段对窗口作裁剪。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学院:理学院专业:信息与计算科学班级:
姓名
学号
指导教师
实验时间
4.
实验地点
计算机实验室
成绩
实验项目名称
裁剪
实验环境
VC++ 6.0
实验内容
(1)理解直线裁剪的原理(Cohen-Surtherland算法、梁友栋算法)
(2)利用VC+OpenGL实现直线的编码裁剪算法,在屏幕上用一个封闭矩形裁剪任意一条直线。
};
Rectangle rect;
int x0,y0,x1,y1;
int CompCode(int x,int y,Rectangle rect)
{
int code=0x00;
if(y<rect.ymin)
code=code|4;
if(y>rect.ymax)
code=code|8;
if(x>rect.xmax)
x0=450,y0=0,x1=0,y1=450;
printf("Press key'c'to Clip!\nPress key'r'to Rrstore!\n");
}
void Reshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
accept=0;
done=0;
int code0,code1,codeout;
code0=CompCode(x0,y0,rect);
code1=CompCode(x1,y1,rect);
do{
if(!(code0 | code1))
{
accept=1;
done=1;
}
else if(code0 & code1)
}
}
}while(!done);
if(accept)
LineGL(x0,y0,x1,y1);
return accept;
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glRectf(rect.xmin,rect.ymin,rect.xmax,rect.ymax);
x=x0+(x1-x0)*(rect.ymax-y0)/(y1-y0);
y=(float)rect.ymax;
}
if(codeout==code0)
{
x0=x;y0=y;
code0=CompCode(x0,y0,rect);
}
else
{ቤተ መጻሕፍቲ ባይዱ
x1=x;y1=y;
code1=CompCode(x1,y1,rect);
y=y0+(y1-y0)*(rect.xmax)/(x1-x0);
x=(float)rect.xmax;
}
else if(codeout&BOTTOM_EDGE){
x=x0+(x1-x0)*(rect.ymin-y0)/(y1-y0);
y=(float)rect.ymin;
}
else if(codeout&TOP_EDGE){
glutReshapeFunc(Reshape);
glutMainLoop();
}
实验结果
实验总结
通过本次试验,理解直线裁剪的原理,利用VC+OpenGL实现直线的编码裁剪算法,在屏幕上用一个封闭矩形裁剪任意一条直线。
glutPostRedisplay();
break;
case'r':
Init();
glutPostRedisplay();
break;
case'x':
exit(0);
break;
default:
break;}
}
void main(int argc,char**argv)
{
glutInit(&argc,argv);
(3)调试、编译、修改程序。
实验原理
编码裁剪算法的主要思想是:对于每条线段,分为三种情况处理。(1)若线段完全在窗口之内,则显示该线段,称为“取”;(2)若线段明显在窗口之外,则丢弃该线段,称为“弃”;(3)若线段既不满足“取”的条件,也不满足“舍”的条件,则把线段分割为两段。其中一段完全在窗口之外,可弃之;对另一段则重复上述处理
LineGL(x0,y0,x1,y1);
glFlush();
}
void Init()
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
rect.xmin=100;
rect.xmax=300;
rect.ymin=100;
rect.ymax=300;
done=1;
else
{
if(code0!=0)
codeout=code0;
else
codeout=code1;
if(codeout&LEFT_EDGE){
y=y0+(y1-y0)*(rect.xmin-x0)/(x1-x0);
x=(float)rect.xmin;
}
else if(codeout&RIGHT_EDGE){
实验过程
#include<GL/glut.h>
#include<stdio.h>
#include<stdlib.h>
#define LEFT_EDGE 1
#define RIGHT_EDGE 2
#define BOTTOM_EDGE 4
#define TOP_EDGE 8
void LineGL(int x0,int y0,int x1, int y1)
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);
}
void keyboard(unsigned char key ,int x,int y)
{
switch(key)
{
case'c':
cohensutherlandlineclip(rect,x0,y0,x1,y1);
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(640,480);
glutCreateWindow("hello world");
Init();
glutDisplayFunc(myDisplay);
code=code|2;
if(x<rect.xmin)
code=code|1;
return code;
}
int cohensutherlandlineclip(Rectangle rect,int&x0,int&y0,int&x1,int&y1)
{
int accept,done;
float x,y;
{
glBegin(GL_LINES);
glColor3f(1.0f,0.0f,0.0f); glVertex2f(x0,y0);
glColor3f(0.0f,1.0f,0.0f); glVertex2f(x1,y1);
glEnd();
}
struct Rectangle
{
float xmin,xmax,ymin,ymax;