计算机图形学实验报告-二维裁剪
计算机图形学-图形变换与裁剪-二维线段裁剪

❖ 顺序连接。 几点说明: 裁剪算法采用流水线方式,适合硬件实现。 可推广到任意凸多边形裁剪窗口
32
Sutherland-Hodgman算法-4/4
存在的问题
❖ 逐边裁剪要求裁剪窗口为凸多边形,那么凹多边形窗口怎么办?
❖ 逐边裁剪法对凹多边形裁剪时,裁剪后分裂为几个多边形, 这几个多边形沿边框产生多余的线段?
裁剪算法的线段可见性测试方法,直至找到每段线段与窗口边界线的 交点或分割子段的长度充分小可视为一点为止
❖ 取中点Pm=(P1+P2)/2。
P2
P2
P1
从P1点出发找距P1最近的可见点
Pm
P1
用P1Pm代替P1P2
P2 Pm
P1
用PmP2代替P1P2
18
1.直线段裁剪(13/18) 中点分割法
❖ 优点:
裁剪结果区域的边界由两部分构成:
1. SP的部分边界
2. CP的部分边界
且在交点处,边界发生交替
即由SP边界转至CP边界
或由CP边界转至SP边界
36
Weiler-Atherton算法-4/7
如果SP与CP有交点,则交点成对出现,
它们被分为如下两类:
❖进点:SP边界由此进入CP
如,I1,I3, I5, I7, I9, I11
当前裁剪边
当前裁剪边
当前裁剪边
当前裁剪边
可见一侧 Pi+1
可见一侧
可见一侧
可见一侧
Pi
Pi+1
Pi I
Pi
Pi+1
Pi+1
Pi
I
窗口
(a) 输出Pi+1
计算机图形学二维图形的裁剪

垂直并指向屏幕里面,即右手坐标系中Z轴的负方向。 反过来,如果P在该边界线的左边(即外侧),这时AB×AP的方向与X-
Y平面垂直并指向屏幕外面,即右手坐标系中Z轴的正方向。 设:点P(x,y)、点A(xA,yA)、点B(xB,yB), 向量AB={(xB-xA),(yB-yA)}, 向量AP={(x-xA),(y-yA)}, 那么AB×AP的方向可由下式的符号来确定:
依次下去,相对于第三条、第四条边界线进行裁剪,最后输出的多边 形顶点序列即为所求的裁剪好了的多边形。如下图所示。
7.3.1 Sutherland-Hodgeman多边形裁剪
新的多边形顶点序列产生规则: 在用窗口一条边界及其延长线裁剪一个多边形时,该边界线把平面分
成两个部分:一部分称为边界内侧;另一部分称为边界外侧。 如下图所示,依序考虑多边形的各条边。假设当前处理的多边形的边为
V=(xB-xA)·(y-yA)-(x-xA)·(yB-yA)
(3-14)
因此,当V≤0时,P在边界线内侧; 而V>0时,P在边界线外侧。
练习
Sutherland-Hodgeman多边形裁剪中,常用向量叉积法来测试当前点P是 否在边界内侧。已知窗口边界A(30,100)、B(40,180),某点P(50, 300),请 问点P在边界内侧吗?
7.3 多边形的裁剪
多边形裁剪的常用算法 1.Sutherland-Hodgeman多边形裁剪 2.Weiler-Atherton任意多边形裁剪
7.3.1 Sutherland-Hodgeman多边形裁剪
Sutherland-Hodgman算法也叫逐边裁剪法,该算法是萨瑟兰德 (I.E.Sutherland)和霍德曼(Hodgman)在1974年提出的。这种算法采用了 分割处理、逐边裁剪的方法。 一、Sutherland-Hodgeman多边形裁剪算法思想:
计算机图形学-图形变换与裁剪-二维线段裁剪

示方向收集顶点序列。 v 如此交替沿两个多边形的边行进。直至回到
跟踪的起始点为止。
38
Weiler-Atherton算法-6/7
S2
C2
I2
I3
主多边形表
裁剪多边形CP
S1
C3
开始 I1
I2
I1
S3
I4
S4
S2 I3
U
S
ymin P1
A
T
L
R
xmin
P2 xmax
ymax P4
P3
B
U
S
ymin P1
A
P2
T
L xmiRn
xmax
22
1.直线段裁剪(16/18)
v 当Q为空集时,线段AB不可能在窗口中有可见线段。 v 当Q不为空集时,Q可看成是一个一维窗口。
v 存在可见线段的充要条件
即
不为空集 。
ymax P4
为提高效率,该算法强调: l 快速判断情形(1)(2); l 减少情形(3)的求交次数和求交所需的计算量。
11
1.直线段裁剪(8/18)
Cohen-Sutherland 算法
算法步骤:
1. 判别线段两端点是否都落在窗口内,如果是,则线 段完全可见,转至第4步;
2. 判别线段是否为显然不可见,如果是,则裁剪结束, 转至第4步 ;
C1 C2 C3 II45 C4 I8 I1 结束 C1 C5 I2
I7 C6 I6 I3 结束
C7
C8 C5
40
v 分割处理策略:
将多边形关于矩形窗口的裁剪分解为多边形关于窗口四边所 在直线的裁剪。
二维图形的裁剪1

7.2.1 Cohen-Sutherland算法
2、判别 根据C1和C2的具体值,可以有三种情况: (1)C1=C2=0,表明两端点全在窗口
内,因而整个线段也在窗内,应予保留。
(2)C1&C2≠0(两端点代码按位作逻辑 乘不为0),即C1和C2至少有某一位同时为1,
表明两端点必定处于某一边界的同一外侧,因
Cohen-Sutherland 算法 (编码算法)
算法思想:
第一步 判别线段两端点是否都落在窗口内,如果是, 则线段完全可见;否则进入第二步; 第二步 判别线段是否为显然不可见,如果是,则裁 剪结束;否则进行第三步 ; 第三步 求线段与窗口边延长线的交点,这个交点将 线段分为两段,其中一段显然不可见,丢弃。 对余下的另一段重新进行第一步,第二步判断, 直至结束
裁剪过程是递归的。
7.2.1 Cohen-Sutherland算法
二、Cohen-Sutherland算法步骤:
1、分区编码 延长裁剪边框将二维平面分成九个区域,每个区域各用一个四位二进 制代码标识。各区代码值如图中所示。 四位二进制代码的编码规则是:
(1)第一位置1:区域在左边界外侧 (2)第二位置1:区域在右边界外侧 (3)第三位置1:区域在下边界外侧 (4)第四位置1:区域在上边界外侧 裁剪窗口内(包括边界上)的区域,四位二进制代码均为0。 设线段的两个端点为P1(x1,y1)和P2(x2,y2),根据上述规则, 可以求出P1和P2所在区域的分区代码C1和C2。
7.2.1 Cohen-Sutherland算法
一、Cohen-Sutherland算法思想: 该算法也称为编码算法,首先对线段的两个端点按所在的 区域进行分区编码,根据编码可以迅速地判明全部在窗口内的 线段和全部在某边界外侧的线段。只有不属于这两种情况的线 段,才需要求出线段与窗口边界的交点,求出交点后,舍去窗 外部分。 对剩余部分,把它作为新的线段看待,又从头开始考虑。 两遍循环之后,就能确定该线段是部分截留下来,还是全部舍 弃。
计算机图形学_第八章_开窗口及二维裁剪

8.1.2 窗口与视区
考察一个图形时,采用两种模型:
•物理模型,它是用户在世界坐标系中描述物体的图形; •逻辑模型,也就是在显示器上呈现的物体的图形.它是
在设备坐标系中描述的。
世界坐标系中描述物体的图形可能相当复杂:
•只能在显示器上显示局部的内容,以使用户能清晰地观
察其细节部分
•用户可能只对图形的某一区域感兴趣,因此也只需要显
若x<xl,则D0=1,否则D0=0; 若x>xr,则D1=1,否则D1=0; 若y<yb,则D2=1,否则D2=0; 若y>yt,则D3=1,否则D3=0。
1001 0001 0101
1000 0000 0100
1010 0010 0110
任何位赋值为1,代表端点落在相应的位置上,否则该位为0。若端点在 裁剪矩形内,区域码为0000。如果端点落在矩形的左下角,则区域码为 0101,其它类推。
Cohen-Sutherland算法
裁剪 裁剪一条线段时,先求出端点p1和p2的编码code1和code2,然后:
1001
0001
1000
0000
1010
0010
0101
0100
0110
(1)若code1|code2=0,对直线段应简取之。 (2)若code1&code2≠0,对直线段可简弃之。
Lecture 8
开窗口及二维裁剪
概述
我们把用一观察窗口有选择地显示物体的某一部分称为 开窗口技术,如果要求删除显示区域之外的画面部分则 称为裁剪,用开窗口技术不但可灵活地显示物体的各个 部分,还可通过动态地改变画面的大小及位置,产生某 些特殊的显示效果。
图形学二维裁剪实验报告

专业班级:学号:姓名:一、试验名称:二维裁剪二、试验目的:在二维观察中,需要在观察坐标系下对窗口进行裁剪,即只保留窗口内的那部分图形,去掉窗口外的图形。
二维裁剪是用计算机生成图形最基本的技能,通过本实验使学生掌握如何用计算机进行二维裁剪并熟悉开发环境。
三、实验原理:算法源代码:void CMyView::OnDraw(CDC* pDC){CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data herePoint FrameLT,FrameRB;Point P[5];FrameLT.x=150;FrameLT.y=150;FrameRB.x=320;FrameRB.y=320;pDC->Rectangle((int)FrameLT.x,(int)FrameLT.y,(int)FrameRB.x,(int)FrameRB. y);for(int i = 0; i < 5; i++){P[i].x = (float)(260 + 150*cos(72*i*PI/180) +0.5);P[i].y = (float)(260 + 150*sin(72*i*PI/180) +0.5);}专业班级:学号:姓名:pDC->MoveTo((int)P[0].x,(int)P[0].y);pDC->LineTo((int)P[2].x,(int)P[2].y);pDC->LineTo((int)P[4].x,(int)P[4].y);pDC->LineTo((int)P[1].x,(int)P[1].y);pDC->LineTo((int)P[3].x,(int)P[3].y);pDC->LineTo((int)P[0].x,(int)P[0].y);}void CMyView::Code(Point FrameLT,Point FrameRB,Point P,unsigned char *Flag){unsigned char flag=0;if(P.x<FrameLT.x) flag+=1;if(P.x>FrameRB.x) flag+=2;if(P.y>FrameRB.y) flag+=4;if(P.y<FrameLT.y) flag+=8;(*Flag)=flag;}void CMyView::Clipping(Point FrameLT,Point FrameRB,Point LineSP,Point LineEP){CClientDC dc(this);unsigned char flagSP,flagEP,flagAND,flagOR;double k=(LineEP.y-LineSP.y)/(LineEP.x-LineSP.x);Code(FrameLT,FrameRB,LineSP,&flagSP);Code(FrameLT,FrameRB,LineEP,&flagEP);专业班级:学号:姓名:flagAND=flagSP & flagEP;if(flagAND!=0)return;while(flagSP!=0||flagEP!=0){flagOR=flagSP|flagEP;if((flagOR&0x01)==1){if((flagSP&0x01)==1){LineSP.y=(float)(LineSP.y+k*(FrameLT.x-LineSP.x)); LineSP.x=FrameLT.x;Code(FrameLT,FrameRB,LineSP,&flagSP);}else{LineEP.y=(float)(LineEP.y+k*(FrameLT.x-LineEP.x)); LineEP.x=FrameLT.x;Code(FrameLT,FrameRB,LineEP,&flagEP);}}if((flagOR&0x02)==2){if((flagSP&0x02)==2){LineSP.y=(float)(LineSP.y+k*(FrameRB.x-LineSP.x)); LineSP.x=FrameRB.x;专业班级:学号:姓名:Code(FrameLT,FrameRB,LineSP,&flagSP);}else{LineEP.y=(float)(LineEP.y+k*(FrameRB.x-LineEP.x)); LineEP.x=FrameRB.x;Code(FrameLT,FrameRB,LineEP,&flagEP);}}if((flagOR&0x04)==4){if((flagSP&0x04)==4){LineSP.x=(float)(LineSP.x+(FrameRB.y-LineSP.y)/k); LineSP.y=FrameRB.y;Code(FrameLT,FrameRB,LineSP,&flagSP);}else{LineEP.x=(float)(LineEP.x+(FrameRB.y-LineEP.y)/k); LineEP.y=FrameRB.y;Code(FrameLT,FrameRB,LineEP,&flagEP);}}if((flagOR&0x08)==8){专业班级:学号:姓名:if((flagSP&0x08)==8){LineSP.x=(float)(LineSP.x+(FrameLT.y-LineSP.y)/k); LineSP.y=FrameLT.y;Code(FrameLT,FrameRB,LineSP,&flagSP);}else{LineEP.x=(float)(LineEP.x+(FrameLT.y-LineEP.y)/k); LineEP.y=FrameLT.y;Code(FrameLT,FrameRB,LineEP,&flagEP);}flagAND=flagSP&flagEP;if(flagAND!=0)return;}dc.MoveTo((int)LineSP.x,(int)LineSP.y);dc.LineTo((int)LineEP.x,(int)LineEP.y);}}void CMyView::OnCut() //裁剪{// TODO: Add your command handler code hereCClientDC dc(this);CPen pen(PS_SOLID,1,RGB(255,255,255));CPen *pOldpen = dc.SelectObject(&pen);专业班级:学号:姓名:CBrush*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));dc.SelectObject(pBrush);Point FrameLT,FrameRB;Point P[5];FrameLT.x=150;FrameLT.y=150;FrameRB.x=320;FrameRB.y=320;dc.Rectangle((int)FrameLT.x,(int)FrameLT.y,(int)FrameRB.x,(int)FrameR B.y);for(int i = 0; i < 5; i++){P[i].x = (float)(260 + 150*cos(72*i*PI/180) +0.5);P[i].y = (float)(260 + 150*sin(72*i*PI/180) +0.5);}dc.MoveTo((int)P[0].x,(int)P[0].y);dc.LineTo((int)P[2].x,(int)P[2].y);dc.LineTo((int)P[4].x,(int)P[4].y);dc.LineTo((int)P[1].x,(int)P[1].y);dc.LineTo((int)P[3].x,(int)P[3].y);dc.LineTo((int)P[0].x,(int)P[0].y);dc.SelectObject(pOldpen);专业班级:学号:姓名:dc.Rectangle((int)FrameLT.x,(int)FrameLT.y,(int)FrameRB.x,(int)FrameR B.y);Clipping(FrameLT,FrameRB,P[0],P[2]);Clipping(FrameLT,FrameRB,P[2],P[4]);Clipping(FrameLT,FrameRB,P[4],P[1]);Clipping(FrameLT,FrameRB,P[1],P[3]);Clipping(FrameLT,FrameRB,P[3],P[0]);}四、实验总结:裁剪处理的主要步骤是:①图元关于窗口内外关系的判别;②图元与窗口的求交。
计算机图形学第6章二维图形的裁剪

• 重点:掌握二维图形点、线段、多边形和字符的裁剪算法 。
• 难点:理解二维图形的裁剪算法思想并且用C语言进行算法 的实现。
一、裁剪的意义 为了描述图形对象,我们必须存储它的全部信息,但有时为了达到分 区描述或重点描述某一部分的目的,往往将要描述的部分置于一个窗口内, 而将窗口外的部分“剪掉”,这个处理过程叫做裁剪,裁剪在计算机图形 处理中具有十分重要的意义。 裁剪实质上是从数据集合中抽取信息的过程,这个过程是通过一定的 计算方法来实现。
7.2.2 中点分割算法
二、中点分割算法实现: 1、将直线的两端点P1、P2编码得:C1、C2; 2、判别 根据C1和C2的具体值,可以有三种情况: (1)C1=C2=0,表明两端点全在窗口内,因而整个线段也在窗内, 应予保留。 (2)C1&C2≠0(两端点代码按位作逻辑乘不为0),即C1和C2至少 有某一位同时为1,表明两端点必定处于某一边界的同一外侧,因而整个线 段全在窗外,应予舍弃。 (3)不属于上面两种情况,均需要求交点。
如果上面四个不等式中任何一个不满足,则点(x,y)位于窗口之 外。 对于任意多边形窗口,需要根据多边形内点的判别准则进行判断。
7.2 线段的裁剪
直线段的裁剪比点复杂,其裁剪方法又是多边形裁剪和三维图形裁剪的 基础。 一、直线裁剪的基本思想 判断直线与窗口的位置关系: 1.确定直线是完全可见; 2.部分可见; 3.还是完全不可见。 对部分可见线段,求出它与窗口边界的交点,并将窗口内的线段输出。
一、中点分割算法思想: 1、中点公式
7.2.2 中点分割算法
2、中点分割法求交点的规则 如图中所示,当线段P1P2求出中点P后,舍弃线段的哪部分,由下面 两条规则决定:
中点分割法求交点规则
计算机图形学中的二维裁剪算法研究

计算机图形学中的二维裁剪算法研究计算机图形学研究的是如何在计算机上制图,根据研究对象的不同又分为二维图形学和三维图形学。
二维图形学研究的范畴是点,线,面。
本文就是介绍计算机图形学中的众多基本算法之一的二维剪裁算法。
在二维剪裁算法中,椭圆形窗口线剪裁算法又是应用最为广泛的算法之一,所以将是本文重点论述的对象。
标签:计算机图形学;二维剪裁算法;椭圆形窗口线剪裁算法计算机图形学中的基本算法对于计算机图形学应用于实践有着重要的作用,而且算法需要时时更新才能够发挥出计算机图形学在实践中的作用。
本文对计算机二维剪裁算法进行介绍,并对其中的椭圆窗口线剪裁算法进行着重的研究分析,探讨如何使该算法更加的稳定高效,方便易行。
算法可以指导人们的工作与生活,所以笔者在本文通过坐标分析设计出一个算法以供读者参考。
1 二维剪裁算法的基本介绍剪裁算法是计算机图形学中的基础算法之一。
剪裁在日常生活和工作中的应用十分广泛,最典型的一个应用就是对整体场景中的局部目的物进行剪裁。
剪裁的过程其实就是将场景中的目的物标记圈出来,一般为矩形窗口框圈出。
矩形窗口框为闪动的虚线框,可以根据剪裁的目的物大小随意变换矩形框的大小。
此外具体说来,剪裁算法还有其他的形式。
如:点剪裁,线段剪裁,多边形剪裁,曲线及文字剪裁等。
现在笔者再详细介绍二维剪裁算法。
二维剪裁算法分为两种,一种是对线段的剪裁,一种是对多边形的剪裁。
因为线段和多边形往往是二维平面中的图形,故而使用二维剪裁算法对其进行剪裁。
目前对该领域的研究已经取得了很丰硕的成果,已经有很多成熟也高效实用的二维剪裁算法。
详细地来说,这些经典的算法有Cyrus—berk二维剪裁算法,Cohen—Sutherland二维多边形剪裁算法等等。
2 椭圆形窗口线剪裁算法的简介在计算机图形学中,椭圆形窗口线剪裁算法是十分重要的一种基础算法。
该算法之所以十分重要,笔者总结为两点原因:首先椭圆形是几何图形中最基础的图形之一,其次在我们的日常生活和工作当中有很多地方的剪裁工作是更适合椭圆形的(我们生活与工作之中,很少有标准的圆形目的物去剪裁,更多情况下是不规则的图像剪裁,而椭圆形可以更好的,更多的剪裁出合适的目的物)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机科学与技术学院
2013-2014学年第一学期《计算机图形学》实验报告
班级:
学号:
姓名:
教师:
成绩:
实验项目(3、二维裁剪)
一、 实验目的与要求
(1) 掌握线段裁剪算法原理,并实现其算法。
(2) 理解多边形裁剪、字符裁剪算法思想,能编程实现其算法。
二、 实验内容
设计菜单程序,利用消息处理函数,完成以下要求:
(1) 实现直线段的标号法(Cohen-Sutherland )、矩形窗口裁剪算法。
(2) 参考教材中的算法,用矩形窗口实现多边形的Sutherland-Hodgman 裁剪算法。
三、 重要算法分析
以下分析Cohen-Sutherland 和Sutherland-Hodgma n 两个算法,其中Cohen-Sutherland 算法的基本思想通过编码的方法快速实现对直线段的裁剪;Sutherland-Hodgman 算法基本思想是用窗口的四条边所在的直线依次来裁剪多边形。
(一) Cohen-Sutherland 算法
该算法的基本思想是:对于每条待裁剪的线段P 1,P 2分三种情况处理:
(1) 若P 1P 2完全在窗口内,则显示该线段。
(2) 若P 1P 2完全在窗口外,则丢弃该线段。
(3) 若线段既不满足“取”的条件,也不满足“舍”的条件,则求线段与窗口边界的交点,在交点处把线段分为两段。
1. 编码原则
具体编码过程为将延长线窗口的四条边线(y T 、y B 、x R 、x L ),将二维平面分成九个区域,全为0的区域是裁剪窗口,其中各位编码的定义如下:
{T y y other T C >=
10 {B y y other B C <=10 {R x x other R C >=
10 {L x x other L C <=10 按照如上定义,相应区域编码如图1所示。
图1 区域编码
2.裁剪算法:
依据上面的编码原则,可以总结出对一条线段的可见性进行测试:
1)若线段两个端点的四位二进制编码全为0000,即两端点编码逻辑或运算为0,那么该线段完全位于窗口内,可直接保留。
2)对端点的四位二进制编码进行逻辑与运算,若结果不为零,那么整条线段必位于窗口外,可直接舍弃。
3)否则,这条线段既不能保留也不能舍弃,它可能与窗口相交。
此时,需要对窗口进行再分割,并对分割后的线段按照一定顺序进行检查,决定保留、舍弃或
再分割。
重复这过程,直到全部线段均被舍弃或保留为止。
(二) Sutherland-Hodgman算法
算法的基本思想是利用窗口的四条边所在的直线依次来裁剪多边形。
多边形的每条边与裁剪线的位置关系有4种情况,如图2所示。
图2 多边形边界与裁剪窗口的关系
其中a)为从外到内的输出P和I,b)为从内到内输出P,c)为从内到外输出I,d)为从外到外不输出。
假设当前处理的多边形为SP。
1)在图2a的情况中,端点S在外侧,P在内侧,则按顺序将交点I和P都输出到结果多边形的顶点表中。
2)在图2b的情况中,端点S和都在内侧,则输出P到结果多边形的顶点表中。
3)在图2c的情况中,端点S在内侧,P在外侧,则输出交点I到结果多边形的顶点表中。
4)在图2d的情况中,端点S和P在外侧,没有输出。
四、程序运行截图
1.用Cohen-Sutherland算法实现线段的裁剪,如图3所示,其中a)图中的线段为裁
剪前的,b)图将超出裁剪多边形的线段部分裁剪后的结果。
图3 Cohen-Sutherland算法裁剪前和后
a)裁剪前 b)裁剪后
2.Sutherland-Hodgman算法实现多边形裁剪,如图4所示。
图4 Sutherland-Hodgman算法裁剪多边形前和后
a)裁剪多边形前 b)裁剪多边形后
五、总结与调试经验
(1)通过这次实验,加深了对图形学的理解,尤其对线段裁剪和多边形裁剪有了更加深入的理解。
(2)我学会了多边形裁剪算法,从刚开始的不知道到现在的理解,这是一个很大的进步,当然我也遇到了些困难,比如用某一条多边形的窗口边界裁剪多边形,
它要分为四种情况来分别考虑,也看出了我的思维不够周密,需要多多锻炼。