计算机图形学 二维裁剪算法Cohen_Sutherland的实现_第1页
计算机图形学 二维裁剪算法Cohen_Sutherland的实现_第2页
计算机图形学 二维裁剪算法Cohen_Sutherland的实现_第3页
计算机图形学 二维裁剪算法Cohen_Sutherland的实现_第4页
计算机图形学 二维裁剪算法Cohen_Sutherland的实现_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验六二维裁剪算法Cohen_Sutherland的实现一、实验目的:理解并掌握直线裁剪算法。使用Visual C+实现二维直线的裁剪的Cohen_Sutherland算法。对窗口进行编码,并实现相应的裁剪函数。二、实验内容及要求:1、 要求用消息映射的方式,绘制出一个裁剪窗口,大小为200150象素;2、 按照例程的步骤画出3条典型线段,分别对应于完全在裁剪窗口内、完全在裁剪窗口外、穿过裁剪窗口三种情况,并按照本实验例程的方法用颜色分别表示出裁剪后的情况;3、 按要求撰写实验报告,写出实验心得,并在实验报告中附上程序的核心算法代码。三、实验设备:微机,Visual C+6.0四、实验内容及步

2、骤:1、 打开VC,新建一个MFC Appwizard项目,选择创建单文档工程(SDI工程)。假设工程名为Clip。如图1和图2所示。图1图22、 在图2的界面上点击Finish,完成工程的创建。3、 在视图类ClipView中定义变量CRect rect; 用于记录裁剪窗口的位置;4、 在ClipView.cpp文件中定义四个宏,记录裁剪窗口的上下左右四个位置:#define LEFT 100#define RIGHT 300#define TOP 150#define BOTTOM 3105、 在视图类的构造函数中为rect赋值;CClipView:CClipView()/ TODO: a

3、dd construction code hererect = CRect(LEFT, TOP, RIGHT, BOTTOM);6、 在视图类(类CFillView中)的OnDraw()函数中绘制裁剪矩形,OnDraw函数的代码如下:void CClipView:OnDraw(CDC* pDC)CClipDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC-Rectangle(&rect);7、 在视图类(类CFillView中)添加成员函数int Encode(in

4、t x, int y),该函数用于对线段的两个顶点进行Cohen_Sutherland编码。函数体如下:int CClipView:Encode(int x, int y)int nCode = 0;if(x RIGHT)nCode = nCode | 0x02;if(y BOTTOM)nCode = nCode | 0x04;if(y GetDC();CPen newPen(PS_SOLID,2,RGB(255,0,0);/用红色2个线宽绘制被裁剪初始直线CPen *pOldPen=pDC-SelectObject(&newPen);pDC-MoveTo(P1);pDC-LineTo(P2)

5、;pDC-SelectObject(pOldPen);CLIP_Line_Cohen_Sutherland(P1,P2);/用窗口裁剪P1P2直线,裁剪后的顶点保存在P1P2中CPen clipPen(PS_SOLID,2,RGB(0,0,255);/用蓝色2个线宽绘制窗口内裁剪之后的线段pOldPen=pDC-SelectObject(&clipPen);pDC-MoveTo(P1);pDC-LineTo(P2);pDC-SelectObject(pOldPen);this-ReleaseDC(pDC);二维的Cohen_Sutherland算法实现完毕。五、核心代码:这里将自己编写的上机程

6、序中的主要代码拷贝粘贴过来;定义:#define LEFT 100#define RIGHT 300#define TOP 150#define BOTTOM 310OnDraw部分:void CClipView:OnDraw(CDC* pDC)CClipDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC-Rectangle(&rect);OnClipLineCohenSutherland();/ TODO: add draw code for native data hereint CClipView:Encode(int x, int y)in

7、t nCode = 0;if(x RIGHT)nCode = nCode | 0x02;if(y BOTTOM)nCode = nCode | 0x04;if(y GetDC();CPen newPen(PS_SOLID,2,RGB(225,0,0);/用红色2个线宽绘制被裁剪初始直线CPen *pOldPen=pDC-SelectObject(&newPen);pDC-MoveTo(P1);pDC-LineTo(P2);pDC-SelectObject(pOldPen);CLIP_Line_Cohen_Sutherland(P1,P2);/用窗口裁剪P1P2直线,裁剪后的顶点保存在P1P2中

8、CPen clipPen(PS_SOLID,2,RGB(0,145,146);/用蓝色2个线宽绘制窗口内裁剪之后的线段pOldPen=pDC-SelectObject(&clipPen);pDC-MoveTo(P1);pDC-LineTo(P2);pDC-SelectObject(pOldPen);this-ReleaseDC(pDC);六、屏幕显示结果:这里将绘出的图形界面拷贝下来;穿过裁剪窗口完全在裁剪窗口内 改变线段坐标CPoint P1 = CPoint(150,160);CPoint P2 = CPoint(200,280);完全在裁剪窗口外CPoint P1 = CPoint(40

9、0,460);CPoint P2 = CPoint(450,380);七、思考题(尽量做,计入成绩):1、如果要用鼠标绘制裁剪窗口和线段,应该如何编程?Cohen_Sutherland算法将窗口平面划分成九个区域,每个区域给予不同的编码。格局线段端点落入不同的区域,给予线段端点不同编码。基于线段端点编码,算法给出了一整套剪裁方法。在剪裁过程中,窗口的参数要多次使用,线段端点需要多次编码,编码的计算需要多次与某些常数相“与”。2、程序其它方面还有什么需要改进的?(提示:如何调用裁剪函数?)在Ondraw加入调用函数:OnClipLineCohenSutherland();3、如果要用LiangB

10、arskey算法实现裁剪,如何修改程序?int ClipT(float p,float q,float *u1,float *u2) int flag=1; float r; if(p*u2) flag=0; else if(r*u1) *u1=r; else if(p0.0) r=q/p; if(r*u1) flag=0; else if(r*u2) *u2=r; else if(q0.0) flag=0; return flag;void Liang_Barsky(int xL,int yT,int xR,int yB,int x1,int y1,int x2,int y2) float

11、dx,dy,u1,u2; u1=0.0;u2=1.0; dx=x2-x1; if(ClipT(-dx,x1-xL,&u1,&u2) if(ClipT(dx,xR-x1,&u1,&u2) dy=y2-y1; if(ClipT(-dy,y1-yT,&u1,&u2) if(ClipT(dy,yB-y1,&u1,&u2) if(u20.0) x1=x1+u1*dx; y1=y1+u1*dy; line(x1,y1,x2,y2); void main(void) int gdriver=DETECT,gmode; int XL,XR,YB,YT; int x0,y0,x1,y1; do register

12、bgidriver(EGAVGA_driver); initgraph(&gdriver,&gmode,); cleardevice(); printf(nLiang_Barskyn); printf(n); printf(Please input the line node(x0,y0,x1,y1):n); scanf(%d,%d,%d,%d,&x0,&y0,&x1,&y1); printf(n); cleardevice(); setcolor(LINE_COLOR); line(x0,y0,x1,y1); getch(); printf(nLiang_Barskyn); printf(n

13、); printf(Please input the rectangle point(XL,YT,XR,YB):n); scanf(%d,%d,%d,%d,&XL,&YT,&XR,&YB); printf(n); cleardevice(); line(x0,y0,x1,y1); setcolor(WINDOW_COLOR); rectangle(XL,YT,XR,YB); getch(); cleardevice(); rectangle(XL,YT,XR,YB); setcolor(LINE_COLOR); Liang_Barsky(XL,YT,XR,YB,x0,y0,x1,y1); ge

14、tch(); printf(nn Continue?(y|n?); getchar(); while(getchar()=y|getchar()=Y); printf(n); printf(press any key to end!); getch(); closegraph();八、实验体会这次试验我的收获只要有两个方面:一个是编程水平的提高,还有一个是对计算机图形学理论知识的巩固。 首先,自此实验帮助我巩固了计算机图形学上课学习的内容,让我对算法的原理有了更为清晰的理解,并且能够根据算法,进行修改和添加,完成算法编出程序而且,在和同学交流过程中,我学会了一些简单的技巧并且能够简单的调试程序,争取自己独立解决在编程过程中遇到的问题。 通过学习和实践,完成

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论