版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、、实验目标1. CohenSutherland线段裁剪;2. LiangBarsky线段裁剪;3. SutherlandHodgeman多边形裁剪;二、实验内容一、实验内容在给定的MFC程序模板中添加Cohen_Sutherland线段裁剪、Liang_Barskyx线段裁剪、Sutherland_Hodgeman多边形裁剪,生成新的程序窗口中要有Cohen_Sutherland线段裁剪、Liang_Barskyx线段裁剪、Sutherland_Hodgeman多边形裁剪的菜单按钮,点击按钮分别弹出Cohen_Sutherland线段裁剪、Liang_Barsky线段裁剪、Sutherland
2、_Hodgeman多边形裁剪的窗口,通过点击鼠标操作实现裁剪框和线段以及多边形的定义和裁剪。二、实验原理1.Cohen_Sutherland线段裁剪该算法也称为编码算法,首先对线段的两个端点按所在的区域进行分区编码,根据编码可以迅速地判明全部在窗口内的线段和全部在某边界外侧的线段。只有不属于这两种情况的线段,才需要求出线段与窗口边界的交点,求出交点后,舍去窗外部分。对剩余部分,把它作为新的线段看待,又从头开始考虑。两遍循环之后,就能确定该线段是部分截留下来,还是全部舍弃。编码延长裁剪边框将二维平面分成九个区域,每个区域各用一个四位二进制代码标识。各区代码值如图中所示。四位二进制代码的编码规则是
3、:(1)第一位置1:区域在左边界外侧(2)第二位置1:区域在右边界外侧(3) 第三位置1:区域在下边界外侧(4)第四位置1:区域在上边界外侧代码XXXX位软第四位第三位第二位第-位某侧边界1下右左0101 ! 0100 ; 0110 IIcs尊法分区编码图1001 ! 1000 i 1010裁剪窗口内(包括边界上)的区域,四位二进制代码均为00设线段的两个端点为P1(x1,y1)和P2(x2,y2),根据上述规则,可以求出P1和P2所在区域的分区代码C1和C2。判别根据C1和C2的具体值,可以有三种情况:(1) C1=C2=0,表明两端点全在窗口内,因而整个线段也在窗内,应予保留。(2) C1
4、&C20(两端点代码按位作逻辑乘不为0),即C1和C2至少有某一位同时为1,表明两端点必定处于某一边界的同一外侧,因而整个线段全在窗外,应予舍弃。(3) 不属于上面两种情况,均需要求交点。求交点假设算法按照:左、右、下、上边界的顺序进行求交处理,对每一个边界求完交点,并相关处理后,算法转向第2步,重新判断,如果需要接着进入下一边界的处理。为了规范算法,令线段的端点P1为外端点,如果不是这样,就需要P1和P2交换端点。当条件(C1&0001W0)成立时,表示端点P1位于窗口左边界外侧,按照下面的求交公式,进行对左边界的求交运算。依次类推,对位于右、下、上边界外侧的判别,应将条件式中的0001分别
5、改为0010、0100、1000即可。求出交点P后,用P1=P来舍去线段的窗外部分,并对P1重新编码得到C1,接下来算法转回第2步继续对其它边界进行判别。与上边界求交点公式: y = y箕“再)与下边界求交点公式:y = yv V %X =(工2 尤1) + 久. 必一必与右边界求交点公式工A *3,工 r 1 r 、y = * 一%. 巧一再与左边界求交点公式:2.LiangBarsky线段裁剪我们知道,一条两端点为Pi(xi,yi)、P2(X2,y2)的线段可以用参数方程形式表示:8式中,Ax=x;-xi,Ay=y-yi,参数u在01之间取值,P(x,y)代表了该线段上的一个点,其值由参数
6、u确定,由公式可知,当u=0时,该点为Pi(xi,yi),当u=i时,该点为P2(x2,y2)。如果点P(x,y)位于由坐标(xwmin,yWmin)和(xWmax,yWmax)所确定的窗口内,那么下式成立:其中,p、q定义为:(3-12)p:3,q.=xL-xwa.nP2=q/父wr:p广必q/广九.pq广沙山一工从(3-i2)式可以知道:任何平行于窗口某边界的直线,其pk=0,k值对应于相应的边界(k=i,2,3,4对应于左、右、下、上边界)。如果还满足qkQ则线段平行于窗口某边界并在窗口内,见图中所示。公式(3-i2)式还告诉我们:1、当pk0时,线段从裁剪边界延长线的内部延伸至及卜部;
7、=0的情况当Ax时,对于左边界pi0(p2=Ax),线段从右边界的内部到外部。当Ay0(p3=-Ay),线段从下边界的内部到外部;对于上边界p40(p4=Ay),线段从上边界的外部到内部。当pKWO时,可以计算出参数u的值,它对应于无限延伸的直线与延伸的窗口边界k的交点,即:w=(3-13)Pk对于每条直线,可以计算出参数U1和U2,该值定义了位于窗口内的线段部分:1、U1的值由线段从外到内遇到的矩形边界所决定(pk0),对这些边界计算rk=qk/pk,U2取0和各个r值之中的最小值。3、如果U1U2,则线段完全落在裁剪窗口之外,应当被舍弃;否则,被裁剪线段的端点可以由U1和U2计算出来。3.
8、SutherlandHodgeman多边形裁剪每次用窗口的一条边界(包括延长线)对要裁剪的多边形进行裁剪,裁剪时,顺序地测试多边形各顶点,保留边界内侧的顶点,删除外侧的顶点,同时,适时地插入新的顶点:即交点和窗口顶点,从而得到一个新的多边形顶点序列。然后以此新的顶点序列作为输入,相对第二条窗边界线进行裁剪,又得到一个更新的多边形顶点序列。依次下去,相对于第三条、第四条边界线进行裁剪,最后输出的多边形顶点序列即为所求的裁剪好了的多边形。如下图所示:卜)多边形与窗口(七)左裁弱(c)上裁剪(d)右裁弱(e)下裁剪新的多边形顶点序列产生规则:在用窗口一条边界及其延长线裁剪一个多边形时,该边界线把平面
9、分成两个部分:一部分称为边界内侧;另一部分称为边界外侧。如下图所示,依序考虑多边形的各条边。假设当前处理的多边形的边为SP(箭头表示顺序关系,S为前一点,P为当前点),边SP与裁剪线的位置关系只有下面四种情况:1. S在外侧,P在内侧。则交点Q当前点P保存到新多边形中2. S、P均在内侧,则当前点P保存到新多边形中。3. S在内侧,P在外侧。则交点Q保存到新多边形中。4. S、P均在外侧。则没有点被保存到新多边形中。外匚二 内 保存:Q、P (a)情况,1内二 内 保存;P内=外 保存:Q(c)情况3外二 外不保存(d)情也4(b)情况2按照窗口左边界连续处理多边形顶点对三、实验步骤5. 打开
10、程序模板,在资源视图中点击cgdemo,在下拉文件中点击menu,然后双击IDR_MAINFRAME,在右边打开的窗口中分别添加Cohen_Sutherland线段裁剪、Liang_Barsky线段裁剪、Sutherland_Hodgeman多边形裁剪菜单按钮并编辑;6. 在解决方案资源管理器中,点击cgdemo,在下拉文件HeaderFiles中点击cgdemoView.h,在cgdemoView.h头文件中添加Cohen_Sutherland线段裁剪、Liang_Barskyx线段裁剪、Sutherland_Hodgeman多边形裁剪的一些定义;再双击下拉文件SourceFiles中的cg
11、demoView.cpp,在标准打印命令中分别添加ON_COMMAND(ID_COHEN_SUTHERLAND,&CcgdemoView:OnCohenSutherland)ON_COMMAND(ID_LIANG_BARSKY,&CcgdemoView:OnLiangBarsky)ON_COMMAND(ID_SUTHERLAND_HODGEMAN,&CcgdemoView:OnSutherlandHodgeman)7. 在CcgdemoView绘制中分别添加绘制递归种子填充、简单种子填充、扫描线种子填充,区域图案填充的elseif语句;在CcgdemoView消息处理程序中添加Cohen_Su
12、therland线段裁剪、Liang_Barskyx线段裁剪、Sutherland_Hodgeman多边形裁剪的case语句;CcgdemoView事件处理程序中分别定义了:voidCcgdemoView二OnCohenSutherland()/TODO:Addyourcommandhandlercodeherem_drawstyle=COHEN_SUTHERLAND;Invalidate(true);voidCcgdemoView:OnLiangBarsky()/TODO:Addyourcommandhandlercodeherem_drawstyle=LIANG_BARSKY;Invali
13、date(true);voidCcgdemoView:OnSutherlandHodgeman()/TODO:Addyourcommandhandlercodeherem_drawstyle=SUTHERLAND_HODGEMAN;Invalidate(true);8. 在cgdemoView.cpp的最后分别编写Cohen_Sutherland线段裁剪的程序:voidCohenSutherland(CDC*pDC,CPointP_begin,CPointP_end);Liang_Barsky线段裁剪的程序:voidLiangBarsky(CDC*pDC,CPointP_begin,CPoin
14、tP_end);Sutheland_Hodgema修边形裁剪程序:voidSutherlandHodgeman(CDC*pDC,CArray&arr_pt);9. 运行调试程序。四、实验遇到的问题及其解决方法(1) 在调试程序时发现程序运行完并正确达到裁减效果,可是窗口点击放大后,裁剪画面消失;为此将画图的程序语句放在裁剪程序框架外,以解决此问题。(2) 在CohenSutherland线段裁剪程序编写时,由于k=float(P_end.y-P_begin.y)/float(P_end.x-P_begin.x);求斜率的程序语句未添加float将k整型,使得线段短点逐渐靠近裁剪框交点的过程中,
15、误差变化越来越大,裁减效果不是预期想要的效果。(3)在LiangBarsky线段裁剪程序编写时,在根据最后得到的U1和U2求新端点坐标的程序语句编写如下:P_begin.x=P_begin.x-u1*(P_begin.x-P_end.x);P_begin.y=P_begin.y-u1*(P_begin.y-P_end.y);P_end.x=P_begin.x-u2*(P_begin.x-P_end.x);P_end.y=P_begin.y-u2*(P_begin.y-P_end.y);由于求新的裁剪后线段终点坐标时,受到上面已经改变的新的起点坐标的影响,使得第二个点求的不正确,在程序运行效果时候表现为:第二个裁剪点明显不符合预期的效果。后更改程序如下,则求新的起始点和新的终点坐标互不影响,程序运行正常P1.x=P_begin.x-u1*(P_begin.x-P_end.x);P1.y=P_begin.y-u1*(P_begin.y-P_end.y);P2.x=P_begin.x-u2*(P_begin.x-P_end.x);P2.y=P_begin.y-u2*(P_begin.y-P_end.y);(4)在SutherlandHodgeman多边形裁剪的程序编写
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025全面市场广告宣传委托合同品牌营销
- 销售合同管理模板风险控制与合规保障
- 2025房屋买卖合同范文
- 零售行业销售数据月度分析报告模板
- 网络维护责任保证承诺书5篇范文
- 游园记趣的游记作文5篇
- 2025设备采购合同争议调解申请书参考
- 企业员工招聘与面试评估标准模板
- 企业采购流程审批与执行规范
- 2025二手车买卖合同协议样板
- 蓝天救援队设备管理制度
- 消防维保合同挂靠协议书
- 关于鸽子的课件教学
- 化疗后骨髓抑制个案护理
- 企业内控培训课件模板
- 2025-2030中国中医馆行业发展分析及投资风险与战略研究报告
- 入团考试试题及答案
- 北京税务局股权转让协议
- 微丸制剂开发-洞察及研究
- 保险合规法律培训课件
- 母婴同室新生儿管理
评论
0/150
提交评论