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

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

ID:59493036

大小:23.50 KB

页数:7页

时间:2020-11-03

计算机图形学实验指导书--实验2使用线段剪裁.doc_第1页
计算机图形学实验指导书--实验2使用线段剪裁.doc_第2页
计算机图形学实验指导书--实验2使用线段剪裁.doc_第3页
计算机图形学实验指导书--实验2使用线段剪裁.doc_第4页
计算机图形学实验指导书--实验2使用线段剪裁.doc_第5页
资源描述:

《计算机图形学实验指导书--实验2使用线段剪裁.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、实验2使用线段剪裁Cohen——sutherland算法一.实验目的及要求根据Cohen——sutherland算法,掌握直线剪裁的程序设计方法。注意,不能使用语言库中的画圆函数。二.理论基础将不需要裁剪的直线挑出,并删去其中在窗外的直线,然后对其余直线,逐条与窗框求交点,并将窗框外的部分删去。采用Cohen-Sutherland直线剪裁的算法一区域编码为基础,将窗口及周围的八个方向以4位的二进制数进行编码。4个位分代表窗外上,下,左右的编码值。三、算法分析1.       Cohen—SutherLand直线裁剪算法裁剪的实质,就是决定图形中那些点、线段、文字、以及多边形在窗

2、口之内。Cohen—SutherLand直线裁剪算法的基本大意是:对于每条线段P1P2,分为三种情况处理。1)       若P1P2完全在窗口内,则显示该线段P1P2,简称“取”之。2)       若P1P2明显在窗口外,则丢弃该线段P1P2,简称“弃”之。3)      若线段既不满足“取”的条件,也不满足“弃”的条件,则把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。为了使计算机能够快速地判断一条线段与窗口属何种关系,采用如下的编码方法。延长窗口的边,把未经裁剪的图形区域分为9个区,每个区具有一个四位代码,即四位二进制数,从左到右各位依次表示上、

3、下、左、右。裁剪一条线段时,先求出端点P1P2所在的区号code1和code2。若code1=0且code2=0,则说明P1和P2均在窗口内,那么整条线段也比在窗口内,应取之。若code1和code2经按位与运算后的结果code1&code2不为0,则说明两个端点同在窗口的上方、下方、左方或右方。若上述两种条件均不成立,则按第三种情况处理,求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段完全在窗口外,可以弃之。再对另一段重复进行上述处理。计算线段与窗口边界(或其延长线)的交点,属于线段与直线求交问题。在实现本算法时,不必把线段与每条窗口边界依次求交,只要按顺序检测

4、到端点区码的某位不为0时,才把线段与对应的窗口边界进行求交。四、提示代码 #include#includevoidinitgr(void)/*BGI初始化*/{intgd=DETECT,gm=0;/*和gd=VGA,gm=VGAHI是同样效果*/registerbgidriver(EGAVGA_driver);/*注册BGI驱动后可以不需要.BGI文件的支持运行*/initgraph(&gd,&gm,"");} clip_a_line(x1,y1,x2,y2,xw_min,xw_max,yw_min,yw_max){ inti,code

5、1[4],code2[4],done,display; floatm; intx11,x22,y11,y22,mark; done=0; display=0; while(done==0){     x11=x1;     x22=x2;     y11=y1;     y22=y2;     encode(x1,y1,code1,xw_min,xw_max,yw_min,yw_max);     encode(x2,y2,code2,xw_min,xw_max,yw_min,yw_max);     if(accept(code1,code2)){         done=

6、1;         display=1;         break;     }     elseif(reject(code1,code2)){         done=1;         break;     }     mark=swap_if_needed(code1,code2);     if(mark==1){         x1=x22;         x2=x11;         y1=y22;         y2=y11;     }     if(x2==x1)         m=-1;     else         m=(float

7、)(y2-y1)/(float)(x2-x1);     if(code1[2]){         x1+=(yw_min-y1)/m;         y1=yw_min;     }     elseif(code1[3]){         x1-=(y1-yw_max)/m;         y1=yw_max;     }     elseif(code1[0]){         y1-=(x1-xw_min)*m;         x1=xw_min;     }     e

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。